Проблемы с объявлением и определением оператора в C ++ - PullRequest
1 голос
/ 10 июня 2009

Мне трудно заставить это работать

file: myclass.hpp

Class MyClass {
public:
  template <class T>    
  MyClass &operator<<(const T &val);
};


file: myclass.cpp

template <class T>
MyClass &MyClass::operator<<(const T &val) {
   ...  
}

Я могу без проблем скомпилировать это с объектом, но когда другие функции пытаются вызвать его, появляется эта ошибка (при каждом использовании <<). </p>

myclass.cpp: undefined reference to `MyClass& MyClass::operator<< <int>(int const&)'

Что я делаю не так?

Ответы [ 3 ]

8 голосов
/ 10 июня 2009

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

YourClass<int>

необходимо увидеть весь шаблон YourClass во время компиляции , чтобы сгенерировать тип с именем

YourClass<int>

и все его методы, которые полностью отделены от, скажем,

YourClass<float>

Это означает, что он должен видеть весь исходный код C ++. Если эти два использования шаблона создаются в отдельных cpp-файлах, то единственный способ, которым компилятор может сгенерировать оба варианта, - полностью определить шаблон в одном заголовке.

Смотрите мой ответ здесь для получения дополнительной информации.

Спасибо за полезные комментарии, которые значительно улучшили этот ответ

4 голосов
/ 10 июня 2009

Поместите определение оператора в .hpp вместо .cpp. Компилятор должен иметь возможность видеть полное определение шаблона при его создании для некоторого нового типа, чтобы он мог сгенерировать код для этой специализации.

В разделе C ++ FAQ Lite .

есть также несколько вопросов и ответов об ошибках такого типа, связанных с шаблонами, и различных возможных решениях.
2 голосов
/ 10 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...