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

3

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

template <class T> 
class MyClass

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

T::const_iterator myIterator; 

...或者类似的东西。我该如何实现呢? 可能不可能或者非常简单,但我一点都不知道。

谢谢回答!

2个回答

12
默认情况下,如果 T 是一个模板参数(例如在您的示例中),则假定 T::some_member 不是类型名称。您需要显式指定它是类型名,通过在其前面加上 typename
typename T::const_iterator myIterator;

这将解决一些解析问题,例如以下示例。
// multiplication, or declaration of a pointer?
T::const_iterator * myIterator;

为了让编译器在实例化模板之前就能解析它,您需要使用 "typename",即使在第一个示例中不会造成歧义的情况下也是如此。关于此的更多信息,请参阅模板FAQ

2
有一种情况下,“typename”不需要使用(也不能使用):派生,例如template<class T> class A : T::const_iterator {}; - Benoît

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

谢谢你,为整个类上下文添加一个额外的类型似乎是个好主意。 - Jörg Haubrichs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接