以下代码在g ++ 4.9.4
下编译得很好template <typename T>
class C{
template <typename S>
friend C fun(S &s){C d; return d;}};
int main(){
int a = 0;
C<double> b = fun<int>(a);
return 0;}
然而,它无法在g ++ 5.4.0下编译:
main.cpp:8:27: error: 'fun' was not declared in this scope
C<double> b = fun<int>(a);
^
main.cpp:8:27: note: suggested alternative:
main.cpp:4:12: note: 'fun'
friend C fun(S &s) {C d;return d;}};
^
main.cpp:8:27: error: insufficient contextual information to determine type
C<double> b = fun<int>(a);
我相信我理解范围问题是友元函数没有范围,并且编译器无法确定返回类C的正确类型。此外,行C&lt;双&gt;不足以确定C的类型。纠正这种情况的一种方法如下:
template <typename T>
class C{
template <typename S>
friend C fun(S &s,C &c) {C d;return d;}};
template<typename T,typename S>
C<T> fun(S s){
C<T> d;
return fun<S>(s,d);}
int main(){
int a = 0;
C<double> b = fun<double,int>(a);
return 0;}
我有两个问题:
两个版本的g ++之间的行为有何不同?换句话说,改变了什么?
使用g ++ 5.4.0时,是否有更好的方法可以恢复g ++ 4.9.4下的行为?