重载<<运算符功能:未解决的外部符号错误



我已经过载<lt;运算符打印类的指针成员中的地址。但是,它抛出了以下错误(使用Visual Studio 2017(。使用普通的类方法就可以完成这项工作。

有线索吗?

错误:

error LNK2019: unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl IntroSmartPointers::operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class IntroSmartPointers::AutoPtr<class IntroSmartPointers::Resource> const &)" (??6IntroSmartPointers@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AEAV12@AEBV?$AutoPtr@VResource@IntroSmartPointers@@@0@@Z) referenced in function "void __cdecl IntroSmartPointers::main(void)" (?main@IntroSmartPointers@@YAXXZ)

代码:

#include <iostream>
using namespace std;
namespace SmartPointers {
template<class T>
class AutoPtr {
private:
T* m_ptr;
public:
// constructor
AutoPtr(T* ptr = nullptr)
: m_ptr(ptr)
{}
// destructor
~AutoPtr() {
delete m_ptr;
}
friend ostream& operator<<(ostream& out, const AutoPtr<T>& ptr);
};
template<class T>
ostream& operator<<(ostream& out, const AutoPtr<T>& ptr) {
out << ptr.m_ptr;
}
class Resource {
public:
Resource() { cout << "Resource(): acquiredn"; }
~Resource() { cout << "~Resource: destroying...n"; }
void sayHi() {
cout << "Hin";
}
};
}
void main() {
SmartPointers::AutoPtr<Resource> ptr{ new Resource{} };
cout << ptr << endl;
}

您的friend声明了非模板运算符
在这种情况下,您可以在类主体内部定义一个友元函数,或者尝试以下操作:

template<typename T>
class AutoPtr {
// ...

template<typename U>
friend ostream& operator<<(ostream& out, const AutoPtr<U>& ptr);
};
template<class T>
ostream& operator<<(ostream& out, const AutoPtr<T>& ptr) {
out << ptr.m_ptr;
return out; // You missed this part too
}

请参阅中的模板友元运算符部分https://en.cppreference.com/w/cpp/language/friend
并且main应该返回int而不是void

最新更新