为什么VC 2013在用作模板函数返回类型时拒绝编译嵌套类型,使用using关键字进行visibile?

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)

Every using-declaration is a declaration and a member-declaration and so can be used
in a class deFinition.

附: ICC,CLang和G都接受typedef版本.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...