Шаблон C ++: «не является производным от типа» - PullRequest
7 голосов
/ 16 мая 2010

Почему этот код недействителен?

#include <vector>

template <typename T>
class A {
  public:
    A() { v.clear(); }

    std::vector<A<T> *>::const_iterator begin() {
      return v.begin();
    }

  private:
    std::vector<A<T> *> v;
};

GCC сообщает о следующих ошибках:

test.cpp:8: error: type 'std::vector<A<T>*, std::allocator<A<T>*> >' is not derived from type 'A<T>'
test.cpp:8: error: expected ';' before 'begin'
test.cpp:12: error: expected `;' before 'private'

Что не так? Как это исправить?

Ответы [ 2 ]

14 голосов
/ 16 мая 2010

В этой строке вам не хватает ключевого слова typename:

std::vector<A<T> *>::const_iterator begin(){

Вам нужно:

typename std::vector<A<T> *>::const_iterator begin(){

Это потому, что std::vector<A<T> *> зависит от параметра шаблона (T) шаблона класса (A). Чтобы разрешить правильный анализ шаблона без необходимости делать какие-либо предположения о возможных специализациях любых других шаблонов, языковые правила требуют, чтобы вы указывали, какие зависимые имена обозначают типы, используя ключевое слово typename.

3 голосов
/ 16 мая 2010

Вам нужно добавить typename, поскольку типы зависят друг от друга, и компилятор не может определить, действительно ли это тип.

Однако на gcc 4.5.0 я получаю более сжатое сообщение об ошибке.:

test.cc:8:3: error: need ‘typename’ before ‘std::vector<A<T>*>::const_iterator’ because ‘std::vector<A<T>*>’ is a dependent scope

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