Я пытаюсь перегрузить оператор < < для шаблона класса, но компилятор дает мне ошибку компоновщика. Цель состоит в том, чтобы иметь возможность отправить указатель базового класса с ссылкой на std :: cout так, чтобы вызываемый производный оператор < <.Шаблоны и оператор перегрузки <<
Возможно ли это?
class IBase
{
public:
IBase() {};
virtual ~IBase() {};
};
template <typename T>
class Derived
: public IBase
{
public:
Derived(T data);
friend std::ostream& operator<<(std::ostream& os, const Derived<T>& dt);
private:
T data_;
};
template <typename T>
Derived<T>::Derived(T data)
: IBase(),
data_(data)
{
}
template <typename T>
std::ostream& operator<<(std::ostream& os, const Derived<T>& dt)
{
os << dt.data_;
return os;
}
int _tmain(int argc, _TCHAR* argv[])
{
// Question 1
Derived<int> der(234);
std::cout << der;
// Question 2
//IBase* base = new Derived<int>(5);
// std::cout << *base
}
Вот ошибки:
ошибка LNK2001: неразрешенный внешний символ «класса станд :: basic_ostream> & __cdecl оператор < < (класс станд :: basic_ostream
&, класс Производный const &) "(?? 6 @ YAAAV? $ Basic_ostream @ DU? $ Char_traits @ D @ std @@@ st ? D @@ AAV01 @ ABV $ производный @ H @@@ Z)
и
фатальным LNK1120 ошибки: 1 неразрешенных внешних
Спасибо! Это сделало трюк –