Цитата(trupca @ 13.8.2013, 12:57 ) | | почему нужно писать именно так? |
обычно, чтобы рассудить 2 компилятора, нужно лезть в стандарт, а это, как правило, дело не благодарное.
Вообще, насколько я понимаю, возможность употребления слова struct при объявлении переменных (и типов возвращаемых значений) сохраняется только для совместимости с Си, и в плюсах им никто не пользуется.
Что касается данного случая, то мой опыт общения с шаблонами говорит, что конструкция
является правильной и корретной, т.к. без слова typename компилятор не должен понимать, что такое bar, ведь вполне может быть, что у какого-то типа определена константа с таким именем. typename как раз и призван указать компилятору, что речь идёт о типе.
Кстати, gcc допускает и использование слова class:
| Код | #include <iostream>
using namespace std;
template <typename T> class foo { public: struct bar { T br; };
bar operator[](int); private: T * bor; };
template <typename T> class foo<T>::bar foo<T>::operator[](int x) { struct bar brrr;
return brrr; }
template class foo<int>;
int main() {
return 0; }
|
выглядит это странно и похоже на какую-то вольность со стороны gcc. |