我遇到了错误的问题
错误LNK2019未解析的外部符号“class std :: basic_ostream>&__ cdecl cop4530 :: operator <<(class std :: basic_ostream>&,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
中,我要求运算符不是成员函数(用于赋值) .
3 回答
你还应该在它实际所属的rob命名空间内声明函数签名:
代码示例的问题;
是
operator<<
被声明为非模板函数 . 对于与Stack
一起使用的每种类型T
,都需要非模板operator<<
. 例如,如果声明了Stack<int>
类型,那么必须有一个运算符实现,如下所示;由于未实现,链接器无法找到它并导致您获得的错误 .
作为旁注; gcc警告如下
这可能不是预期的,每个瞬间原子都有自己的实现 .
要更正此问题,您可以在
Stack
类型之前声明模板运算符,然后声明为朋友,即实例化 . 语法看起来有点尴尬,但看起来如下;上面的代码限制了运算符与
Stack
的相应实例化的友谊,即operator<< <int>
实例化仅限于访问Stack<int>
实例化的私有成员 .替代方案包括允许友谊扩展到模板的所有实例化;
然后可以在类定义内部或外部内联执行
operator<<
的实现 .除了@ LibertyPaul的答案,你需要添加一个
template<T>
给朋友std::os...
行,以便工作: