GCC 4.8.1接受
template <typename T> class Subclass : public Baseclass<T> { public: using typename Baseclass<T>::Baseclass; };
但MSVC没有.另一方面,MSVC接受
template <typename T> class Subclass : public Baseclass<T> { public: using typename Baseclass::Baseclass; };
但GCC没有.那么我在这个问题上看到了另一种声明:c++11 inheriting template constructors
template <typename T> class Subclass : public Baseclass<T> { public: using typename Baseclass::Baseclass<T>; };
而MSVC则向其提供了一个“过时的声明风格”,GCC说
prog.cpp:8:24: error: ‘template<class T> class Baseclass’ used without template parameters using typename Baseclass::Baseclass<T>;
我以为第一个例子是标准符合语法.直观地看,对我来说是正确的.
什么是c 11标准符合语法?
解决方法
答案有点埋在标准中.使用声明定义为(7.3.3):
using [typename] nested-name-specifier unqualified-id;
嵌套名称说明符在一些步骤之后解析为simple-template-id,定义为
template-name < [template-argument-list] >
简而言之,符合标准的语法是
template <typename T> class Subclass : public Baseclass<T> { public: using typename Baseclass<T>::Baseclass; };