重载 << 运算符函数:未解决的外部符号错误
overloaded << operator function : unresolved external symbol error
我重载了 << 运算符来打印 class 的指针成员中的地址。但是,它会抛出以下错误(使用 Visual Studio 2017)。使用正常的 class 方法即可完成工作。
有线索吗?
错误:
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(): acquired\n"; }
~Resource() { cout << "~Resource: destroying...\n"; }
void sayHi() {
cout << "Hi\n";
}
};
}
void main() {
SmartPointers::AutoPtr<Resource> ptr{ new Resource{} };
cout << ptr << endl;
}
您的 friend
声明了非模板运算符。
在这种情况下,您可以在 class 主体内定义一个友元函数,或者尝试以下操作:
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
应该 return int
而不是 void
.
我重载了 << 运算符来打印 class 的指针成员中的地址。但是,它会抛出以下错误(使用 Visual Studio 2017)。使用正常的 class 方法即可完成工作。
有线索吗?
错误:
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(): acquired\n"; }
~Resource() { cout << "~Resource: destroying...\n"; }
void sayHi() {
cout << "Hi\n";
}
};
}
void main() {
SmartPointers::AutoPtr<Resource> ptr{ new Resource{} };
cout << ptr << endl;
}
您的 friend
声明了非模板运算符。
在这种情况下,您可以在 class 主体内定义一个友元函数,或者尝试以下操作:
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
应该 return int
而不是 void
.