Почему этот код не действителен?
#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'
Что не так? Как зафиксировать его?
В этой строке отсутствует ключевое слово typename
:
std::vector<A<T> *>::const_iterator begin(){
Вам нужно:
typename std::vector<A<T> *>::const_iterator begin(){
Это потому, что std :: vector *>
зависит в параметре шаблона ( T
) шаблона класса ( A
). Чтобы включить правильный синтаксический анализ шаблона без необходимости делать какие-либо предположения о возможных специализациях любых других шаблонов, правила языка требуют, чтобы вы указали, какие зависимые имена обозначают типы, с помощью ключевого слова typename
.
Вам нужно добавить typename, поскольку типы зависят друг от друга, и компилятор не может определить, действительно ли это тип.
Однако в gcc 4.5.0 я получаю более краткое сообщение об ошибке:
test.cc:8:3: error: нужно 'typename' перед 'std :: vector *> :: const_iterator ', потому что' std :: vector *> 'является зависимой областью