Ошибка C ++: объявление члена не найдено - PullRequest
8 голосов
/ 13 января 2012

Я новичок в 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;
}

при компиляции компилятор всегда говорит: ' Объявление члена не найдено '. почему

Я использую Eclipse CDT + Cygwin GCC

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

Ответы [ 3 ]

6 голосов
/ 13 января 2012

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

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

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

1 голос
/ 20 марта 2013

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

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

0 голосов
/ 13 января 2012

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

...