猿问

c++重载输入输出函数时怎么解决 “[Warning] declares a non-template function”?

我在做一道c++模板题,描述如下:“为Array类创建一个模板。这个模板允许在编译的时候Array对象实例化指定元素个数的特定的元素类型。”而当我重载输入输出流函数的时候编译总是不通过。
编译器显示:[Warning]frienddeclaration'std::istream&operator>>(std::istream&,Array&)'declaresanon-templatefunction[-Wnon-template-friend][Warning]frienddeclaration'std::ostream&operator<<(std::ostream&,constArray&)'declaresanon-templatefunction[-Wnon-template-friend]
代码如下:
#include
usingnamespacestd;
template
classArray
{
private:
Tp[n];
staticintcount;
public:
friendistream&operator>>(istream&in,Array&a);
friendostream&operator<<(ostream&out,constArray&a);
intgetSize()
{
returnn;
}
staticintgetArrayCount()
{
returncount;
}
};
template
istream&operator>>(istream&in,constArray&a)
{
for(inti=0;i{
in>>a.p[i];
}
a.count++;
returnin;
}
template
ostream&operator<<(ostream&out,constArray&a)
{
for(inti=0;i{
out<}
returnout;
}
在此贴上主函数:
intmain()
{
ArrayintArray1;
cin>>intArray1;
ArrayintArray2;
cin>>intArray2;
ArrayfloatArray;
cin>>floatArray;
cout<<"\nIntArray1contains"<cout<<"ThevaluesinintArrayare:\n";
cout<cout<<"\nIntArray2contains"<cout<<"ThevaluesinintArrayare:\n";
cout<cout<<"\nDoubleArraycontains"<cout<<"ThevaluesinthedoubleArrayare:\n";
cout<cout<<"\nThereare"<::getArrayCount()<<"Arrayobjects.\n";
cout<<"\nThereare"<::getArrayCount()<<"Arrayobjects.\n";
return0;
}
我在网上查了很久,也尝试了很多解决方法,可是无论是在istream&operator>>(istream&in,constArray&a)这一行里的>>后面加上<>还是把输入输出函数在类里面定义,都是不行。如果在类里面定义的话,就会显示如下错误:undefinedreferenceto`Array::count'[Error]ldreturned1exitstatus
如果在>>后面加上<>的话,会显示如下错误:[Error]template-id'operator>><>'indeclarationofprimarytemplate
所以现在举步维艰,完全没有头绪。还望各路大神能解答我的疑惑并解释一下为什么会出现以上三种错误。万分感谢!
慕斯709654
浏览 1357回答 2
2回答

守候你守候我

首先静态成员变量count需要在类外定义。其次,问题主要出在试图将函数模板的某个特化声明为类的友元,标准貌似不支持这个(具体的wording没有找到)。同样的效果可以通过简单的在类模板内定义函数友元来实现:templateclassX{friendvoidfoo(T){/*...*/}};或将函数模板声明为类模板的友元:templateclassX{templatefriendvoidfoo(U);};
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答