我在做一道c++模板题,描述如下:
“为Array类创建一个模板。这个模板允许在编译的时候Array对象实例化指定元素个数的特定的元素类型。”
而当我重载输入输出流函数的时候编译总是不通过。
编译器显示:
[Warning] friend declaration 'std::istream& operator>>(std::istream&, Array<T, n>&)' declares a non-template function [-Wnon-template-friend]
[Warning] friend declaration 'std::ostream& operator<<(std::ostream&, const Array<T, n>&)' declares a non-template function [-Wnon-template-friend]
代码如下:
#include<iostream>
using namespace std;
template<class T,int n>
class Array
{
private:
T p[n];
static int count;
public:
friend istream & operator>> (istream & in, Array<T,n>& a);
friend ostream & operator << (ostream & out,const Array<T,n>& a);
int getSize()
{
return n;
}
static int getArrayCount()
{
return count;
}
};
template<class T,int n>
istream & operator >> (istream & in,const Array<T,n>& a)
{
for(int i=0;i<n;i++)
{
in>>a.p[i];
}
a.count++;
return in;
}
template<class T,int n>
ostream & operator << (ostream & out,const Array<T,n>& a)
{
for(int i=0;i<n;i++)
{
out<<a.p[i]<<" ";
}
return out;
}
在此贴上主函数:
int main()
{
Array< int, 5 > intArray1;
cin >> intArray1;
Array< int, 5 > intArray2;
cin >> intArray2;
Array< float, 5 > floatArray;
cin >> floatArray;
cout << "\nIntArray1 contains " << intArray1.getSize() << " Elements.\n";
cout << "The values in intArray are:\n";
cout << intArray1;
cout << "\nIntArray2 contains " << intArray2.getSize() << " Elements.\n";
cout << "The values in intArray are:\n";
cout << intArray2;
cout << "\nDoubleArray contains " << floatArray.getSize() << " Elements.\n";
cout << "The values in the doubleArray are:\n";
cout << floatArray;
cout << "\nThere are " << Array<int,5>::getArrayCount() << " Array<int,5> objects.\n";
cout << "\nThere are " << Array<float,5>::getArrayCount() << " Array<float,5> objects.\n";
return 0;
}
我在网上查了很久,也尝试了很多解决方法,可是无论是在
istream & operator >> (istream & in,const Array<T,n>& a)
这一行里的 >> 后面加上 <> 还是把输入输出函数在类里面定义,都是不行。
如果在类里面定义的话,就会显示如下错误:
undefined reference to `Array<float, 5>::count'
[Error] ld returned 1 exit status
如果在 >> 后面加上 <> 的话,会显示如下错误:
[Error] template-id 'operator>><>' in declaration of primary template
所以现在举步维艰,完全没有头绪。
还望各路大神能解答我的疑惑并解释一下为什么会出现以上三种错误。
万分感谢!
首先静态成员变量count需要在类外定义。
其次,问题主要出在试图将函数模板的某个特化声明为类的友元,标准貌似不支持这个(具体的wording没有找到)。同样的效果可以通过简单的在类模板内定义函数友元来实现:
或将函数模板声明为类模板的友元: