我有一些错误代码的代码我不明白如何解决。我问过我的教授和助教,除了更准确地理解错误的含义外,没有运气就咨询了互联网。从我所知道的来看,编译器会让我的重载操作符与内置操作符混淆,或者它根本不认为它是一个重载操作符。关于C++模板上的重载操作符的一些编译错误
我收到以下错误和警告:
|| ===项目4项,调试=== | \ project 4 \ forest.h | 13 | warning:friend declaration'Forest & operator +(Forest &,Forest &)'声明了非模板函数|注意:(如果这不是你想要的,请确保函数模板已经被声明,并且在函数名称后面加上<>)|
\ project 4 \ forest.h | 13 |
\项目4 \ forest.h | 14 |警告:朋友宣言 '的std :: ostream的&操作< <(STD :: ostream的&,常量森林&)' 声明一个非模板函数|
\项目4 \ forest.h | 15 |警告:朋友宣言 '的std :: istream的&操作>>(的std :: istream的&,森林&)' 声明一个非模板函数|
\ project 4 \ main.cpp ||在函数'int main()'中: \ project 4 \ main.cpp | 21 | error:'文件>> intForest'中'操作符'的模糊重载|
c:\ program files(x86)\ codeblocks \ mingw \ bin .. \ lib \ gcc \ mingw32 \ 4.4.1 \ include \ C++ \ istream | 119 |注意:考生是:std :: basic_istream < _CharT ,_Traits> &的std :: basic_istream < _CharT,_Traits> ::运算>>(标准:: basic_istream < _CharT,_Traits> &(*)(标准:: basic_istream < _CharT,_Traits> &))[用_CharT =炭,_Traits = std :: char_traits] |
c:\ program files(x86)\ codeblocks \ mingw \ bin .. \ lib \ gcc \ mingw32 \ 4.4.1 \ include \ C++ \ istream | 123 | note:std :: basic_istream < _CharT,_Traits> &的std :: basic_istream < _CharT,_Traits> ::运算>>(标准:: basic_ios < _CharT,_Traits> &(*)(标准:: basic_ios < _CharT,_Traits> &))[用_CharT =炭,_Traits = std :: char_traits] |
c:\ program files(x86)\ codeblocks \ mingw \ bin .. \ lib \ gcc \ mingw32 \ 4.4.1 \ include \ C++ \ istream | 130 | note:std :: basic_istream < _CharT,_Traits> & std :: basic_istream < _CharT,_Traits> :: operator >>(std :: ios_base &(*)(std :: ios_base &))[with _CharT = char,_Traits = std :: char_traits] | || ===构建完成:1个错误,3个警告=== |
当我尝试编译我的代码。相关的代码段如下:
(在forest.h)
template< typename NODETYPE > class Forest
{
public:
friend Forest<NODETYPE>& operator+(Forest<NODETYPE>&, Forest<NODETYPE>&);
friend ostream& operator<<(ostream&, const Forest<NODETYPE>&);
friend istream& operator>>(istream&, Forest<NODETYPE>&);
Forest();
Forest(const Forest& otherForest);
~Forest();
void nodes(int&) const;
private:
ForestNode<NODETYPE> *root;
ForestNode<NODETYPE> *getNewNode(const NODETYPE &);
};
(在森林
。CPP)template<typename NODETYPE> istream& operator>>(istream& file, const Forest<NODETYPE>& f1)
{
istream file2 = file;
int nodeCount = 0;
string blah = ' ';
while(getline(file2,blah))
{
nodeCount++;
}
ForestNode<NODETYPE> *forestNodeArray[nodeCount];//holds pointers to last node of depth i
getline(file,*f1.root.tag);
forestNodeArray[0] = &(*f1.root);
inputHelper(file, 0, *f1.root, forestNodeArray, nodeCount);
return file;
}
(终于,在main.cpp中)
int main()
{
Forest <char> intForest();
filebuf fb;
fb.open ("forest1.txt",ios::in);
istream file(&fb);
cout << typeid(intForest).name() << endl;
cout << typeid(file).name() << endl;
file >> intForest;
fb.close();
}
任何帮助将不胜感激。
编辑:感谢亚历克斯和阿尔夫,我明白他们为什么不被视为模板功能。回想起来很明显,我只是设置了这些签名。无论如何,我仍然得到关于模糊运算符的错误。为什么编译器不能识别我的操作符并使用它,而不是试图在操作符的3个内置版本之间做出决定,这些操作符不可能有一个参数为Forest?
尝试'模板<>朋友森林与运营商+' –
2010-10-28 05:28:13
@alex啊。这解决了警告。谢谢。我有点希望声明保持原来的样子,这是由于我的教授给出的项目指南中指定的函数签名,但我开始越来越关注遵守这些函数签名和更多关于有工作代码。再次感谢。 – joedillian 2010-10-28 05:36:28
好吧,如果你仔细想想,朋友函数的签名取决于你的模板参数'NODETYPE',所以它们也必须是模板。没有办法绕过它。 – 2010-10-28 16:32:29