2012-01-13 3 views
8

Я новичок C++. Сегодня у меня есть проблема: в заголовочном файле, я определяю класс:Ошибка C++: Объявление участника не найдено

template<class T> class Ptr_to_const { 
private: 
    Array_Data<T>* ap; 
    unsigned sub; 

public: 
     ... 

    Ptr_to_const<T> & operator=(const Ptr_to_const<T> & p); 

}; 

и в исходном файле, я запрограммировать как:

template<class T> Ptr_to_const<T>& Ptr_to_const<T>::operator=(
     const Ptr_to_const<T> & p) { 
     ... 
    return *this; 
} 

при компиляции, компилятор всегда говорят: "Участник декларация не найдена '. Почему?

Я использую затмение CDT + Cygwin GCC

большое спасибо!

+1

AFAIK вы не должны внедрять класс шаблона в исходный файл. Задайте определение функции в заголовке. – Lucian

ответ

6

Классы шаблонов должны быть объявлены и определены в заголовке или другом файле, который включен пользователями. Они не могут быть объявлены в заголовке и определены в исходном файле, как обычно.

Причина в том, что шаблон должен быть заменен фактическим типом и источником для сгенерированного и скомпилированного при его использовании, а компилятор, конечно, не может предварительно скомпилировать шаблоны для всех возможных типов, которые могут возникнуть, поэтому пользователям необходимо быть в состоянии справиться с этим (и, следовательно, нужен доступ к коду).

Это вызывает некоторые проблемы при передаче объектов, если в несколько библиотек включены одни и те же шаблоны, поскольку они могут быть скомпилированы в разных версиях заголовка (см. Правило определения).

0

Вы должны включить ваш исходный файл в конце заголовка файла или определить функцию-член в файле заголовка при определении шаблона класса

1

«заявление членов не найден» ошибка производится с помощью статического анализа Затмения инструмент (codan), а не компилятор. Если вы получите эту ошибку, но компиляция завершится успешно, это ложное срабатывание. Старые версии этого инструмента, как известно, дают некоторые ложные срабатывания, см., Например, this bug report. Поэтому я рекомендую обновить Eclipse CDT до последней версии. Если это не поможет, отправьте отчет об ошибке в Eclipse CDT.

Однако, если вы также получаете ошибки от компилятора (это указывает проблема C/C++ в столбце «Тип» в представлении «Проблемы»), вы, вероятно, забыли включить заголовочный файл.

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