g ++ 4.9.4和g ++ 5.4.0之间的范围差异

时间:2017-01-04 11:38:35

标签: c++ scope compiler-errors g++

以下代码在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;}

我有两个问题:

  1. 两个版本的g ++之间的行为有何不同?换句话说,改变了什么?

  2. 使用g ++ 5.4.0时,是否有更好的方法可以恢复g ++ 4.9.4下的行为?

0 个答案:

没有答案