我正在努力更好地了解C ++的一些高级员工。我现在正在尝试理解stream operator overloading
,friend function
和template
。我试图在一个代码段中学习所有这些东西。
所以,我正在尝试实现一个只包含template class
的{{1}},我想用array
填充它。所以,我想出了这个。
stream operator
这是非常简单的代码段。但是,我在编译时遇到以下错误
#include <iostream>
using namespace std;
template<class T, int L>
class TestClass
{
private:
T data[L];
public:
friend void operator>>(const istream&, const TestClass<T,L>&);
};
template<class T, int L>
void operator>>(const istream& in, const TestClass<T,L>& q)
{
for(int i = 0; i < L; i++)
{
in >> q.data[i];
}
}
int main() {
TestClass<float, 3> Q;
cin >> Q;
return 0;
}
带有以下警告
undefined reference to `operator>>(std::istream const&, TestClass<float, 3> const&)'
我知道,我正在做一些新手的错误,因为我对这件事情很陌生。如果有人帮助成功运行它将会很棒。
答案 0 :(得分:2)
问题是双重的:
friend
功能也应该是模板istream
和TestClass
作为常量。删除这是更新的代码:
template<class T, int L>
class TestClass
{
private:
T data[L];
public:
template<class U, int M>
friend void operator>>(istream&, TestClass<U,M>&);
};
template<class T, int L>
void operator>>(istream& in, TestClass<T,L>& q)
{
for(int i = 0; i < L; i++)
{
in >> q.data[i];
}
}
声明朋友的语法略有不同,一切都会有效Demo:
template<class T, int L>
class TestClass
{
private:
T data[L];
public:
friend void operator>> <>(istream&, TestClass&);
};
(谢谢@chris)。此格式(使用<>
)与上述示例的不同之处在于,上述技术上将operator>>
的所有实例化声明为friend
而仅此一个有一对一的关系。
或者,您可以将定义与朋友声明Demo一起包括在内:
template<class T, int L>
class TestClass
{
private:
T data[L];
public:
friend void operator>>(istream& in, TestClass& q){
for(int i = 0; i < L; i++)
{
in >> q.data[i];
}
}
};