Шаблоны C ++ и доступ к пространствам имен - PullRequest
3 голосов
/ 24 декабря 2009

Допустим, я использую шаблонный класс с чем-то простым, например:

template <class T> 
class MyClass

Я хочу использовать элементы из пространства имен T, например, T может быть строкой, а я хотел использовать

T::const_iterator myIterator; 

... или что-то в этом роде. Как мне этого добиться? Возможно, это либо невозможно, либо очень просто, но я понятия не имею.

Спасибо за ответы!

Ответы [ 2 ]

12 голосов
/ 24 декабря 2009

По умолчанию, если T является параметром шаблона, как в вашем примере, предполагается, что T::some_member не называет тип. Вы должны явно указать, что это так, добавив префикс typename:

typename T::const_iterator myIterator;

Это решает некоторые проблемы с синтаксическим анализом, как в следующем примере

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

Чтобы компилятор мог разобрать это даже до создания экземпляра шаблона, вы должны помочь ему и использовать typename, в том числе в тех случаях, когда он не будет неоднозначным, как в первом случае выше. Шаблон FAQ имеет более глубокое понимание этого.

5 голосов
/ 24 декабря 2009

Это определенно возможно.

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...