Visual Studio 2013(更新2)在编译模板函数时会抛出编译时错误,该模板函数的返回类型为嵌套类型名称,该名称已通过多次继承隐藏,并使用using关键字再次可见;如以下代码所示:

struct Base1
{
  typedef int value_type;
};

struct Base2
{
  typedef double value_type;
};

struct Derived : Base1, Base2
{
  using Base1::value_type;
};

template<typename T>
typename T::value_type nullary_function() { return 0; }

template<typename T>
typename T::value_type unary_function(T t) { return 0; }

int main()
{
  nullary_function<Derived>(); // Error: C2770
  unary_function( Derived() ); // Error: C2893
  return 0;
}

(错误号取决于函数是否接受模板参数,如注释中所示。)

G++ 4.7接受此代码。

具体来说,我想知道C++标准在这件事上要说些什么,以及这是否是VC++编译器错误。 (据我所知,据我所知,使用using关键字使嵌套类型可见,使它们在所有其他情况下均可见)。

我还知道带有using关键字的行可能会从
using Base1::value_type;


typedef Base1::value_type value_type;

为了使代码正确地编译和运行,但是对于某些(可能)有效的代码在某些编译器而非其他编译器上进行移植似乎很可移植-因此需要澄清。

最佳答案

这确实是一个编译器错误-ICC,CLang和G++都接受Godbolt上验证的代码。

我可以在标准中找到的最适用的语言是7.3.3(namespace.udecl)p2(引用自N3337)



P.S. ICC,CLang和G++都接受typedef版本。

关于c++ - 当用作模板函数的返回类型时,为什么VC++ 2013拒绝编译使用using关键字可见的嵌套类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25547514/

10-13 03:58
查看更多