嵌套模板代码的编译会导致MSVC或GCC错误

时间:2018-08-13 08:58:00

标签: c++ templates gcc visual-c++

以下代码在MSVC和GCC中均无法编译。对于'typename'关键字的存在,它产生与编译器行为完全相反的行为。 MSVC要求在A :: B 之前包含'typename',否则显示错误,而GCC要求删除typename'关键字。有没有办法解决此问题而无需使用#ifdef /#endif块?

template <class C>
class A
{
   template <class D>
   class B
   {
   };

   template <class E>
   void get(typename A::B<E>& value)
   {
   }
};

int main(int argc, char *argv[])
{
    return 0;
}

不存在'typename'关键字时的MSVC输出:

warning C4346: 'A<C>::?$B@$RCAAB@': dependent name is not a type
note: prefix with 'typename' to indicate a type
error C2061: syntax error: identifier 'B'

存在“ typename”关键字时的GCC输出:

error: 'typename A<C>::B' names 'template<class C> template<class D> class A<C>::B', which is not a type

0 个答案:

没有答案