2009-12-24 89 views
3

比方说,我使用的是模板类中包含一些简单的:C++模板和访问命名空间

template <class T> 
class MyClass 

我想用从T的名称空间的元素,例如叔可能是字符串,我想用

T::const_iterator myIterator; 

...或类似的东西。我如何实现这一目标? 也许它不是或者很简单,但我不知道。

感谢您的回答!

回答

12

默认情况下,如果T是您的示例中的模板参数,则假定T::some_member未命名类型。你必须明确指定,它是通过与typename前缀是:

typename T::const_iterator myIterator; 

这解决像下面的例子

// multiplication, or declaration of a pointer? 
T::const_iterator * myIterator; 

因此,一些分析问题,编译器甚至可以实例化之前解析此模板,您必须亲自动手并使用typename,包括在不会模棱两可的情况下,例如上面的第一种情况。 Template FAQ对此有更深入的了解。

+0

很好的答案,谢谢! – 2009-12-24 17:00:18

+2

有一种情况不需要使用“typename”(并且不能):派生,例如模板 class A:T :: const_iterator {}; – 2009-12-24 18:38:31

+0

@Benoit,对。好的音符。 – 2009-12-24 18:43:36

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部分。

+0

也谢谢你,让它成为整个班级情况的额外类型似乎是一个好主意。 – 2009-12-24 17:01:17