假设我正在使用模板化的类,其中包含一些简单的类:
template <class T>
class MyClass
我想使用T命名空间中的元素,例如T可以是字符串,我想使用
T::const_iterator myIterator;
......或类似的东西。我如何实现这一目标? 可能,它要么不可能,要么非常简单,但我不知道。
感谢您的回答!
答案 0 :(得分:12)
默认情况下,如果T
是模板参数(如示例所示),则假定T::some_member
不命名类型。您必须通过在其前面添加typename
:
typename T::const_iterator myIterator;
这解决了一些解析问题,如下例
// multiplication, or declaration of a pointer?
T::const_iterator * myIterator;
因此,编译器甚至可以在实例化模板之前对其进行解析,您必须手动使用typename
,包括那些不会模糊的情况,就像上面的第一种情况一样。 Template FAQ对此有更深入的了解。
答案 1 :(得分:5)
绝对有可能。
template< typename T >
class Example
{
void foo( const T& t )
{
typedef typename T::value_type Type;
typedef typename T::const_iterator Iter;
Iter begin = t.begin();
Iter end = t.end();
std::copy( begin, end, std::ostream_iterator<Type>(std::cout) );
}
};
键是typedef的typename部分。