以下代码在MVCC下编译但不是g ++,我不知道为什么。
template <typename T>
class A
{
public:
template <typename C>
class B
{
public:
C* cptr;
};
typedef typename A<T>::B<T> Ttype;
};
int main(int argc,char** argv)
{
A<int>::Ttype d;
d.cptr = 0;
}
使用g ++,你得到
error: 'typename A<T>::B name template<class T> template<class C> class A<T>::B', which is not a type
我正在使用-std = c ++ 11
进行编译答案 0 :(得分:6)
我认为这是MVCC的一个错误。这不会编译,因为您需要使用template
来消除B
作为模板的歧义:
typedef typename A<T>::template B<T> Ttype;
答案 1 :(得分:6)
根据gcc错误消息,问题是您声称A<T>::B
是一种类型,但它不是:它是一个类模板。 <{3}}和gcc都对
typedef A<T>::B<T> Ttype;
即删除typename
。在给定的上下文中,不可能将B
专门化为与其显然不同的东西。
using
- 别名的语法不同:
using Ttype = A<T>::B<T>;
使用额外template
关键字的表示法首先声明B
实际上是template
,然后与实例化typename
B<T>
结合使用是一种类型:
typedef typename A<T>::template B<T> Ttype;
或
using Ttype = typename A<T>::template B<T>;
由于班级模板B
无论如何都是本地的,因此在这种情况下并不需要这种资格,即
typedef B<T> Ttype;
和
using Ttype = B<T>;
也可以。
答案 2 :(得分:5)
对我来说看起来像个错误。
以下适用于GCC 4.8.1:
using Ttype = A<T>::B<T>;