我有一些带有一些错误的代码,我根本不知道如何解决。我已经问过我的教授和助教,除了更准确地了解错误的含义之外,还没有运气就上网了。据我所知,编译器要么使我的重载运算符与内置运算符混淆,要么根本没有将其识别为重载运算符。我收到以下错误和警告:|| ===项目4,调试=== |\ project 4 \ forest.h | 13 |警告:朋友声明'Forest&operator +(Forest&,Forest&)'声明了非模板函数|\ project 4 \ forest.h | 13 |注意:(如果这不是您想要的,请确保已声明功能模板,并在此处在功能名称后添加)|\ project 4 \ forest.h | 14 |警告:朋友声明'std :: ostream&运算符\ project 4 \ forest.h | 15 |警告:朋友声明'std :: istream&operator >>(std :: istream&,Forest&)'声明了非模板函数|\ project 4 \ main.cpp ||在函数“ int main()”中:|\ project 4 \ main.cpp | 21 |错误:“文件>> intForest”中“操作符>>”的模棱两可的重载|c:\ program files(x86)\ codeblocks \ mingw \ bin .. \ lib \ gcc \ mingw32 \ 4.4.1 \ include \ c ++ \ istream | 119 |注:候选对象是:std :: basic_istream & std :: basic_istream :: operator >>(std :: basic_istream &(*)(std :: basic_istream &))[with _CharT = char,_Traits = std :: char_traits] |c:\ program files(x86)\ codeblocks \ mingw \ bin .. \ lib \ gcc \ mingw32 \ 4.4.1 \ include \ c ++ \ istream | 123 |注:std :: basic_istream &std :: basic_istream :: operator >>(std :: basic_ios &(*)(std :: basic_ios &))[with _CharT = char,_Traits = std :: char_traits ] |c:\ program files(x86)\ codeblocks \ mingw \ bin .. \ lib \ gcc \ mingw32 \ 4.4.1 \ include \ c ++ \ istream | 130 |注:std :: basic_istream &std :: basic_istream :: 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 &);};(在forest.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();}任何帮助将不胜感激。编辑:感谢alex和alf,我明白为什么不将它们视为模板函数。回想起来很明显,我只是被这些签名所吸引。无论如何,我仍然会收到有关歧义运算符的错误。为什么编译器不能识别我的运算符并使用它,而不是尝试在3个内置操作符版本之间进行选择,而这些版本可能没有一个参数作为Forest? 最佳答案 第二个错误在此行中:Forest < char > intForest();起初这可能令人惊讶,但该行并未声明类型为Forest<char>的变量,而是声明了不带参数并返回Forest<char>的函数。只需从声明中删除括号即可:Forest < char > intForest;关于第一个警告,已经进行了解释(声明为friend的函数不是模板,这意味着您必须为实例化Forest<>的每种类型手动实现它(可能不希望这样做)。 ),还请注意,声明模板化的operator+,然后像@Alf P. Steinbach的回答中那样使该模板成为朋友,这意味着Forest<int>将成为Forest<double>的朋友,这可能不是您所需要的。注释中的@Alex建议只会使模板的特定实例成为朋友,这可能更接近于您想要的实例,但是您需要在模板类之前声明模板化运算符,为此,您需要向前声明模板类...模板中无朋友功能的常见模式是在适当位置定义功能:template <typename T>class Forest { // ... friend Forest& operator+( Forest const & lhs, Forest const & rhs ) [1] { // implementation here }}// [1] Note that the arguments are const references (read only), and also note that// you do not need to provide the type argument inside the template declaration这样,您就可以将其定义为非模板函数,同时让编译器为您实例化该函数。同样,在处理模板时,通常也更容易定义在类定义中内联的成员方法。它使工作变得更简单,毕竟在大多数情况下,您确实需要在(相同)头文件中提供实现。但是,定义二进制运算符时,更好的方法是将operator+=定义为成员方法,然后可以轻松地将operator+定义为非自由函数。该模式为:struct test { test& operator+=( test const & );};test operator+( test lhs, test const & rhs ) { // [2] lhs += rhs; return lhs;}// [2] Note that the first argument is by value, and the second by const reference// This means that the compiler will copy the first argument for you, and you// are free to modify it with the += operator and return the copy.现在,最棘手的部分是混合前两个建议。为了能够定义operator+这是模板定义内的自由函数,一个常见的技巧是使它成为朋友,即使出于访问原因而不必这样做:template <typename T>class Forest { Forest& operator+=( Forest const & ) { // implemenation } friend Forest operator+( Forest lhs, Forest const & rhs ) { // [3] return lhs+=rhs; }};// [3] friendship only to allow us to define the free function inside the template// declaration.关于c++ - 有关C++中模板上的重载运算符的一些编译器错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4039979/
10-11 22:47