我已经过载<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
。