C ++模板和访问命名空间

时间:2009-12-24 16:47:05

标签: c++ class templates namespaces

假设我正在使用模板化的类,其中包含一些简单的类:

template <class T> 
class MyClass

我想使用T命名空间中的元素,例如T可以是字符串,我想使用

T::const_iterator myIterator; 

......或类似的东西。我如何实现这一目标? 可能,它要么不可能,要么非常简单,但我不知道。

感谢您的回答!

2 个答案:

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