2012-12-05 30 views
1

我读的是如何在C++ typename关键字使用这种很好的总结:http://pages.cs.wisc.edu/~driscoll/typename.html的typedef资格依赖性类型

不过我想知道一个具体的例子:

template<typename T> class Outer{ 
    public: 
    class Inner1{ 
     T t; 
    }; 
    class Inner2{ 
     int t; 
    }; 
}; 

template<typename T> void foobar(void) 
{ 
    std::list<Outer<T>::Inner1> l; 
} 

从上面我明白链接的文本我需要

std::list<typename Outer<T>::Inner1> l; 

因为Inner1既合格又相关。

但是:Inner2也需要一个令我困惑的类型名称: 首先,它似乎很清楚Inner2是一种类型(好吧,Inner1已经清楚了)。其次,Inner2根本不依赖T.对于所有可能的Ts,Inner2将是相同的(类型)!

当我在模板中使用限定类型时,是否需要typedef?是否依赖于模板参数?

+1

'对于所有可能的TS,Inner2将是相同的(类型)' - 不,考虑类模板特! –

回答

1

Outer<T>::Inner2确实取决于类型T,因为编译器不知道Inner2是什么类型的东西 - 无论是类型还是例如一个静态数据成员。所以,是的,你需要告诉编译器这是什么样的事情,因为默认是假设它是非类型成员(例如静态数据成员,方法名称,enum值),因此在这里使用typename

(这是真正的C++ 03 - 我假设的规则上这并没有改变中的C++ 11)

+1

C++ 11也一样。 – Nawaz

3

你的第二个假设是错误的。 Inner2 does依赖于T,因为每个外部都有另一个Inner2。如果你擅长外变得清晰:

template<> class Outer<char>{ 
public: 
    class Inner1{ 
    T t; 
    }; 
    typedef int Inner2; 
}; 

而且,即使你不擅长,Outer<float>::Inner2Outer<long>::Inner2可能具有相同的布局,会员,名称等,但它们不是同一类型!考虑访问 - Outer<long>::Inner2已经访问Outer<long>的私有成员,Outer<float>::Inner2没有。

在下面的专业化Inner2甚至不是一个类型:

template<> class Outer<long double>{ 
public: 
    char Inner2(int); 
}; 
+0

的确,我没有考虑专业化!非常感谢! – user1878401