C++,重载操作符<<模板函数,申明其为另一模板类的友元函数。编译通过不了。 请教各位前辈,希望前辈指点

重载操作符<<模板函数,申明其为另一模板类的友元函数。编译通过不了。
初学者我感到很困惑,请教各位前辈,希望前辈指点,非常感谢非常感谢
--------------------------------------------------------------------------------------------
#include<iostream>
using namespace std;
template<class T>class A;//声明A模板类
template<class T>ostream & operator<<(ostream &,A<T>&);//申明重载操作符<<模板函数
//定义A模板类
template<class T>class A{
public:
A<T>():i(1){}
friend ostream & operator<<(ostream & os,A<T>&);//申明友元函数
private:
int i;
};
//定义模板函数。
template<class T>ostream & operator<<(ostream & os,A<T>& a){
os<<a.i; //第14行(A错误)
return os; //第15行(C错误)
}
//调用部分
void main(){
A<int> a;
cout<<a;
}
编译反馈信息(A错误): temp.cpp(14) : error C2248: 'i' : cannot access private member declared in class 'A<int>'。
PS:编译器没有认同模板函数是A模板类的友元函数。
初学者我也从网上得到2中答案。
1、把“friend ostream & operator<<(ostream & os,A<T>&);”//申明友元函数
改成
“friend ostream & operator<< <Type>(ostream & os,A<T>&);(B错误)”(c++primer书籍也是用这种方法)或者“friend ostream &

operator<< <>(ostream & os,A<T>&);”
编译器不能认同这个做法,提出的反馈是(B错误):“error C2143: syntax error : missing ';' before '<'”
2、把“friend ostream & operator<<(ostream & os,A<T>&);”//申明友元函数
改成“template<class T>
friend ostream & operator<< (ostream & os,A<T>&);”
编译器也不能认同这个做法,提出的反馈是(C错误):“temp.cpp(15) : error C2562: '<<' : 'void' function returning a value”

ps:请教各位前辈,希望前辈指点,非常感谢非常感谢
楼下 滨崎步最爱,非常感谢你,虽然你没有回答到点上。我今天在网上看了资料
可以这样做。
把using namespace std;
改成
using std::cout;
using std::ostream;
这样编译就可以通过了,远行也是正常的。
-------------------------------------------------------
我补充了问题,知道怎么改了。但是不是很明白为什么要这样子,谁能麻烦解释一下吗,或者具体的链接学习一下也可以啊,
如果把
using std::cout;
using std::ostream;
using namespace std; 如果这三句写在一起还是会出错的。 再次感谢。。。

第1个回答  2011-04-12
一般都是用 using namespace std; 而不用 std::cout 这种写法。当然两者是有区别的。
cout 这个名字定义在命名空间 std 中。std 命名空间中还有其他名字,比如 cin、cerr 等,如果你 using namespace std; 则这些名字全部可以使用,所以把一些你用不着的名字也包含进来了。
如果只是 std::cout ,则要使用 cin 时也必须写成 std::cin,比较麻烦,但是不会将不需要使用到的名字包含进来。
第2个回答  2011-04-11
friend ostream & operator<<(ostream & os,A<T>&);//
是这句话没写对,既然operator<<是模板 就要给出参数类型
friend ostream& operator<< <T>(ostream& os,A<T>&);
至于你改写的“friend ostream & operator<< <Type>(ostream & os,A<T>&); Type 是什么啊,
定义类A用的是T

不好意思,如果真如你说的那样,那你的编译器早就不能用了,你的代码就是少了<T> ,至于你说的把std 换掉就能解决问题,切,胡扯八道 ,你还是查查std是什么
建议你用vs2005 或者vs2010本回答被提问者采纳

C++重载运算符。 太TM难了。 进来看看
注:cout和cin都是C++中iostream类的一个对象,对于cout<<使用的<<运算符,是在类中被重载了的,因此<<运算符就是一个重载的操作运算符。将操作符重载函数声明为友元时,这时的操作符重载函数必须多一个形参,若操作符成员函数是类的成员函数,则要少一个形参,还有,有些操作符重载函数必须声明为友...

c++中运算符(\\" << \\")重载ostream&是什么意思
运算符重载,是对现有操作符使用于自定义用户类型的一种扩展,但具体的性质不能变,如<<表示流操作符左侧对象为流的本质不能变,+为两元操作符本质不能变,再如,对于->重载必须返回指针类型不可变!即,即使进行运算符重载,也只是有限自由!friend ostream & operator << (ostream &os, const CPo...

c++中的重载运算符<<和>>为什么是只可以为友元函数,不可是成员函数?我...
如果是重载双目操作符(即为类的成员函数),就只要设置一个参数作为右侧运算量,而左侧运算量就是对象本身。。。而 >> 或<< 左侧运算量是 cin或cout 而不是对象本身,所以不满足后面一点。。。就只能申明为友元函数了。。。如果一定要声明为成员函数,只能成为如下的形式:ostream & operator<<(os...

C++中,complex重载输入输出操作符 error C2248: 'real' : cannot a...
friend ostream& operator>>(ostream& os,const complex &c);ostream& operator >>( ostream &os,const complex c)\/\/少了一个&

为什么C++操作符<<重载老是提示:operator <<' is ambiguous
<<和>>的重载必须作为类的友元函数,不能作为成员函数.所有应该在你的mycomplex类中,加上friend ostream& operator<<(ostream &os, mycomplex &second);的声明,然在在.cpp文件中实现该函数就可以了.

请教c++运算符重载程序报错原因
这可能是编译器的原因。有些低版本的编译器,除了在类中申明友元关系之外,还要在类定义前对函数进行前向声明。如:Class Time;Time& operator++(Time& a);Time operator++(Time& a,int);ostream& operator<<(ostream& o,const Time& t);如果你用的是vc6.0的话就会出现这种情况。虽然重载运算...

C++中的运算符重载,帮我详细介绍下
运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据导致不同类型的行为。运算符重载的实质就是函数重载。在实现过程中,首先把指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参,然后根据实参的类型来确定需要调用的函数,这个过程是在编译过程中完成的...

操作符的C++ 中重载操作符
第一步:在成员函数和非成员函数之间选择你可以用类成员函数的方式实现二元操作符如:+、- 以及 ==,例如:class String {public: bool operator==(const String & s); \/\/ 比较 *this 和 s};这个方法是有问题的。相对于其内建的操作符来说,重载的操作符在这里不具有对称性;它的两个参数一...

关于C++重载的问题
首先作为‘+’操作符,应该是 value1 = value+i;的形式 重载函数中的第一个参数是指加号前的参数,第二个参数指加号后的参数,因此,除非有特殊要求,两个参数都不应有默认值。并将重载的操作符声明为类的友元函数。作为类中的成员函数 在函数参数中不应该定义两个参数,因为‘+’之前的参数默认...

c++重载运算符号
{ <函数体> } 2.运算符重载时要遵循以下规则:(1) 除了类属关系运算符"."、成员指针运算符".*"、作用域运算符"::"、sizeof运算符和三目运算符"?:"以外,C++中的所有运算符都可以重载。(2) 重载运算符限制在C++语言中已有的运算符范围内的允许重载的运算符之中,不能创建新的运算符。(3)...

相似回答
大家正在搜