【发布时间】:2016-06-19 14:12:26
【问题描述】:
我遇到了错误问题
错误 LNK2019 未解析的外部符号 "class std::basic_ostream > & __cdecl cop4530::operator &,class rob::Stack const &)" (??6rob@@YAAAV?$ basic_ostream@DU?$char_traits@D@std@@@std@@AAV12@ABV?$Stack@H@0@@Z) 在函数 _main Project7 c:\Users\Robrik\documents\visual studio 2015\Projects\ 中引用Project7\Project7\post.obj 1
现在,post 所做的只是调用operator<<
声明
namespace rob {
template < typename T> class Stack {
friend std::ostream& operator<< (std::ostream& os, const Stack<T>& a);
void print(std::ostream& os, char ofc = ' ') const;
private:
std::vector<T> arr;
};
定义
template < typename T>
inline std::ostream & rob::operator<<(std::ostream & os, const Stack<T>& a) {
return a.print(os, ' ');
}
template<typename T>
inline void rob::Stack<T>::print(std::ostream & os, char c) const
{
for (int i = 0; i != arr.size(); i++)
{
os << c << arr[i];
}
os << '\n';
}
它们分别位于.h 文件和.hpp 中,我要求运算符不是成员函数(用于赋值)。
【问题讨论】:
-
hpp 文件可能不包含在使用
operator<<的任何文件中。要获得更好的答案,请发布MCVE。显然你没有发布你的真实代码(例如你的Stack没有任何成员arr)所以你真的是在让我们猜测你在真实代码中可能犯了什么错误。 -
还要检查template friends FAQ,以防您的问题在那里得到解决
-
文件被正确地包含在一起,因为在 .h 文件中声明并在 .hpp 文件中定义的其他函数可以工作。只有运算符重载存在链接器问题,我敢肯定,如果我能修复一个,其他的将以相同的方式修复。
-
我知道您已经解决了这个问题,但请参阅我对错误开始原因的回答以及您可能的替代方案。
-
我找不到一个像样的副本(尤其是与未解析的符号有关),所以 +1 询问它。
标签: c++ templates operator-overloading friend