2016-12-05 10 views
1

У меня есть тип виртуального int_type в code being adapted from here метод, единственный случай, когда код выдает ошибку компиляции:INT_TYPE не называя тип расстройства

‘int_type’ does not name a type 
int_type ThreadLogStream::overflow(int_type v) 
^. 

шаги Debugging до сих пор

  • Если я нахожусь над любым другим экземпляром int_type в IDE Qt Creator, он показывает traits_type::int_type std::basic_streambuf::int_type, подразумевая, что каждый другой экземпляр int_type не должен быть причиной проблемы.

  • Согласно this reference, int_type действительно принадлежит basic_streambuf, но называть его Traits::int_type не помогло.

  • Я попытался напечатать переменную проблемы, как показано в typedefs ниже, но char_type и traits_type не были распознаны.

threadlogstream.cpp

... 
int_type ThreadLogStream::overflow(int_type a) 
{ 
    int_type b = a; //This gives no errors 

    return b; 
} 
... 

threadlogstream.hpp

#include <iostream> 
#include <streambuf> 
#include <string> 

//typedef std::basic_streambuf< char_type, traits_type> base_class; 
//typedef typename base_class::int_type int_type; 

class ThreadLogStream : public QObject, std::basic_streambuf<char> { 

    Q_OBJECT 

public: 
    ThreadLogStream(std::ostream &stream); 
    ~ThreadLogStream(); 

protected: 
    virtual int_type overflow(int_type v); // This gives no errors 
    virtual std::streamsize xsputn(const char *p, std::streamsize n); 
} 

Пожалуйста, помогите - я теряю волосы над этим.

+0

Это не должно компиляция, если 'int_type' не отображается в глобальном пространстве имен.Вы должны использовать квалифицированное имя для возвращаемого типа, когда функция объявлена ​​вне класса. – AnT

ответ

1

Оказывается, что ваш int_typeфбар должен быть на уровне std::basic_streambuf<>::int_type. В этом случае в качестве внеклассного определения члена вы должны написать

ThreadLogStream::int_type ThreadLogStream::overflow(int_type a) 
{ 
    ... 

т.е. использовать квалифицированное имени типа возвращаемой функции. Имена параметров просматриваются в области видимости класса (поэтому просто int_type компилируется в списке параметров). Но возвращаемые типы просматриваются в охватывающей области, поэтому вы должны явно его качественно.

Так оно и было на C++.

Однако тип возврата в задний тип возвращаемого синтаксиса (доступен, так как начиная с C++ 11) также ищется в области видимости класса, что означает, что вы можете сделать это в качестве альтернативы

auto ThreadLogStream::overflow(int_type a) -> int_type 
{ 
    ... 
1

Похоже, что вам нужно сделать это тип возвращаемого трейлинг, например, так:

auto ThreadLogStream::overflow(int_type v) -> int_type { 
    // ... 
} 

Объяснение: int_type необходимо рассматривать в сферу ThreadLogStream, но если у вас есть ведущий тип возвращаемого значения, это будет отображаться в области пространства имен, так как он приходит до, вы указываете имя ThreadLogStream::overflow, которое запускает поиск в области ThreadLogStream. Помещая возвращаемый тип послеквалифицированный идентификатор, этой проблемы избежать.

+0

Не должно быть 'auto' впереди? – Pixelchemist

+0

@Pixelchemist да, извините, я исправил его – Brian

 Смежные вопросы

  • Нет связанных вопросов^_^