【问题标题】:C++ Templates and accessing namespacesC++ 模板和访问命名空间
【发布时间】:2010-12-29 20:40:26
【问题描述】:

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

template <class T> 
class MyClass

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

T::const_iterator myIterator; 

...或类似的东西。我该如何做到这一点? 可能,这要么不可能,要么很简单,但我不知道。

感谢您的回答!

【问题讨论】:

    标签: c++ class templates namespaces


    【解决方案1】:

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

    typename T::const_iterator myIterator;
    

    这解决了一些解析问题,如下例所示

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

    为了让编译器在实例化模板之前就可以解析它,你必须帮助它并使用typename,包括在它不会模棱两可的情况下,比如上面的第一种情况。 Template FAQ 对此有更深入的了解。

    【讨论】:

    • 有一种情况是“typename”不必使用(也不能使用):派生,例如 template class A : T::const_iterator {};
    【解决方案2】:

    绝对有可能。

    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) );
        }
    };
    

    key 是 typedef 的 typename 部分。

    【讨论】:

    • 也谢谢你,让它成为整个类上下文的额外类型似乎是个好主意。
    猜你喜欢
    • 1970-01-01
    • 2011-02-01
    • 2018-05-14
    • 2010-11-22
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    相关资源
    最近更新 更多