t******m 发帖数: 255 | 1 #include
templateclass Rational;//forward deceleration
template std::ostream& operator<< (std::ostream& , const
Rational& ); //为什么这里用 不行。而在class里要用
templateclass Rational
{
public:
Rational(const T & top,const T & bottom):Numerator(top),Denominator(
bottom){}
const T& Num()const{return Numerator;}
const T& Dem()const{return Denominator;}
virtual ~Rational(){}
friend std::ostream& operator<< (std::ostream& , const Ratio |
z****e 发帖数: 2024 | 2 template std::ostream& operator<< (std::ostream& , const
Rational& );
把operator<<后边的去掉。
你加上,是一个specialization的形式, 但是无从specialize 起,本身就错误的语法。
另外,你根本不需要friend呀,都是通过公有interface干的事情。
如果class里边没有,是一个普通函数,你没定义过,编译器找不到。
或者你根本用不着模板,就直接把friend定义class里边,也不用,也不用forward delcare,这样,每次,class模板生成一次,都新生成一个overload friend,的普通函数。
明白否? |
t******m 发帖数: 255 | 3 Thanks
语法。
delcare,这样,每次,class模板生成一次,都新生成一个overload friend,的普通
函数。
【在 z****e 的大作中提到】 : template std::ostream& operator<< (std::ostream& , const : Rational& ); : 把operator<<后边的去掉。 : 你加上,是一个specialization的形式, 但是无从specialize 起,本身就错误的语法。 : 另外,你根本不需要friend呀,都是通过公有interface干的事情。 : 如果class里边没有,是一个普通函数,你没定义过,编译器找不到。 : 或者你根本用不着模板,就直接把friend定义class里边,也不用,也不用forward delcare,这样,每次,class模板生成一次,都新生成一个overload friend,的普通函数。 : 明白否?
|
t******m 发帖数: 255 | 4 按道理说,如果我把forward中的和class 中的都去掉,应该可以编译过了吧
语法。
delcare,这样,每次,class模板生成一次,都新生成一个overload friend,的普通
函数。
【在 z****e 的大作中提到】 : template std::ostream& operator<< (std::ostream& , const : Rational& ); : 把operator<<后边的去掉。 : 你加上,是一个specialization的形式, 但是无从specialize 起,本身就错误的语法。 : 另外,你根本不需要friend呀,都是通过公有interface干的事情。 : 如果class里边没有,是一个普通函数,你没定义过,编译器找不到。 : 或者你根本用不着模板,就直接把friend定义class里边,也不用,也不用forward delcare,这样,每次,class模板生成一次,都新生成一个overload friend,的普通函数。 : 明白否?
|
g**********1 发帖数: 1113 | 5 may need the declaration of operator* in the body of class. |
t******m 发帖数: 255 | 6 operator* is the global function.
【在 g**********1 的大作中提到】 : may need the declaration of operator* in the body of class.
|
z****e 发帖数: 2024 | 7 汝仍旧不知我心。
forward的T是语法错误,没有这么写的。
class的T是表示该函数是模板,去掉T,只剩<>亦可。
【在 t******m 的大作中提到】 : 按道理说,如果我把forward中的和class 中的都去掉,应该可以编译过了吧 : : 语法。 : delcare,这样,每次,class模板生成一次,都新生成一个overload friend,的普通 : 函数。
|
z****e 发帖数: 2024 | 8 如果你是编译器,看到forward 已经就是一个模板了,紧接着后面又看到一个,作
何感想?
template std::ostream& operator<<, 明明白白说了是个模板,后面再
加一个是画蛇添足吗?但是善良的编译器,会最大耐心的去理解你,会认为你是最
有聪明才智的人,不会犯这种错误,肯定是你有特殊的目的,才会告诉编译器,这不仅
仅是个模板,而且要用类型T,这个特殊的目的就是specialization。
但是,编译器猛然发现,你根本没有定义普通形式的模板,而且这个类型也不存在
,啊!原来你刷我,我就和死磕。 |
t******m 发帖数: 255 | 9 OK了,知晓也
【在 z****e 的大作中提到】 : 如果你是编译器,看到forward 已经就是一个模板了,紧接着后面又看到一个,作 : 何感想? : template std::ostream& operator<<, 明明白白说了是个模板,后面再 : 加一个是画蛇添足吗?但是善良的编译器,会最大耐心的去理解你,会认为你是最 : 有聪明才智的人,不会犯这种错误,肯定是你有特殊的目的,才会告诉编译器,这不仅 : 仅是个模板,而且要用类型T,这个特殊的目的就是specialization。 : 但是,编译器猛然发现,你根本没有定义普通形式的模板,而且这个类型也不存在 : ,啊!原来你刷我,我就和死磕。
|