2009-05-21 3 views
1

Когда я пытаюсь использовать свой итератор классПочему этот тип возврата не работает? (C++)

template<class T> 
class list 
{ 
public: 
class iterator; 
}; 

template<class T> 
class list<T>::iterator 
{ 
//stuff 
}; 

как тип возвращаемого значения в перегрузке оператора,

template<class T> 
class list<T>::iterator 
{ 
public: 
iterator& operator++(); 
protected: 
list* lstptr; 
}; 

template<class T> 
iterator& list<T>::iterator::operator++() 
{ 
(this->lstptr)->current = ((this->lstptr)->current)->next; 
return this; 
} 

я получаю эти ошибки:

s:\jeffrey_\my_freeware_games\o\resources\container class\container(spec- o)\container_def.h(213) : error C2143: syntax error : missing ';' before '&' 
s:\jeffrey_\my_freeware_games\o\resources\container class\container(spec- o)\container_def.h(213) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
s:\jeffrey_\my_freeware_games\o\resources\container class\container(spec- o)\container_def.h(213) : error C2065: 'T' : undeclared identifier 
c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(235) : error C2039: 'Yes' : is not a member of 'vc_attributes' 
c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(235) : error C2065: 'Yes' : undeclared identifier 
c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(236) : error C2039: 'No' : is not a member of 'vc_attributes' 
c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(236) : error C2065: 'No' : undeclared identifier 
c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(237) : error C2039: 'Maybe' : is not a member of 'vc_attributes' 
c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(237) : error C2065: 'Maybe' : undeclared identifier 
c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(240) : error C2039: 'NoAccess' : is not a member of 'vc_attributes' 
c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(240) : error C2065: 'NoAccess' : undeclared identifier 
c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(241) : error C2039: 'Read' : is not a member of 'vc_attributes' 
c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(241) : error C2065: 'Read' : undeclared identifier 
c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(242) : error C2039: 'Write' : is not a member of 'vc_attributes' 
c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(242) : error C2065: 'Write' : undeclared identifier 
c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(243) : error C2039: 'ReadWrite' : is not a member of 'vc_attributes' 
c:\program files\microsoft visual studio 9.0\vc\include\codeanalysis\sourceannotations.h(243) : error C2065: 'ReadWrite' : undeclared identifier 
c:\program files\microsoft visual studio 9.0\vc\include\crtdefs.h(582) : error C2146: syntax error : missing ';' before identifier 'time_t' 
c:\program files\microsoft visual studio 9.0\vc\include\crtdefs.h(2047) : error C2143: syntax error : missing ';' before 'identifier' 
c:\program files\microsoft visual studio 9.0\vc\include\crtdefs.h(2047) : warning C4091: 'typedef ' : ignored on left of 'localeinfo_struct' when no variable is declared 
c:\program files\microsoft visual studio 9.0\vc\include\crtdefs.h(2047) : fatal error C1075: end of file found before the left brace '{' at 'c:\program files\microsoft visual studio 9.0\vc\include\crtdefs.h(174)' was matched 

NB: container_def.h - это заголовочный файл для моих классов и классов итераторов, я понятия не имею, что такое souceannotations или crtdefs.

ответ

5

iterator еще не известен в этой точке. Вы должны сказать ему это в list<T> классе:

требуется
template<class T> 
typename list<T>::iterator& list<T>::iterator::operator++() { 
    (this->lstptr)->current = ((this->lstptr)->current)->next; 
    return *this; // *this here, since this is a pointer only 
} 

Обратите внимание на typename, так как list<T>::iterator тип с префиксом специализации шаблона, и вы должны сообщить компилятору о том, что - несмотря на то, что Visual C++, вероятно, примет код, не помещая typename перед этим. Опуская typename, компилятор должен предположить, что он не является типом и должен сортировать сообщение с тем же сообщением об ошибке.

Вы могли бы безопасно себя, что хлопоты, поставив код прямо в класс:

template<class T> 
class list<T>::iterator 
{ 
public: 
iterator& operator++() { 
    (this->lstptr)->current = ((this->lstptr)->current)->next; 
    return *this; // *this here, since this is a pointer only 
} 
protected: 
    list* lstptr; 
}; 
+0

Yep, typename определенно то, что я искал (я не знал, что он существует) Я пробовал использовать список :: iterator &, но компилятор сказал мне, что он не распознал это как тип. – 2009-05-21 01:57:26

+0

О, хорошо. Похоже, что компилятор действительно требует его в некоторых местах. В некоторых сообщениях я видел, что люди, использующие msvC++, не обязаны размещать их в определенных местах, где это необходимо нормально :) –

1

LITB имеет answered ваш вопрос полностью. Я думаю, стоит подчеркнуть, что в целях упрощения использования C++ Комитет C++ добавил новый синтаксис для объявления функций. Результат является то, что вы будете в состоянии определить свою функцию следующим образом (n2541) без необходимости дополнительной квалификации:

template<class T> 
auto list<T>::iterator::operator++()->iterator& 
{ 
    // ... 
} 

Согласно поддержке функции list, GCC 4.4 уже имеет эту функцию.

Смежные вопросы