Опубликовано 26 марта, 200818 г. comment_5292939 Подскажите, пожалуйста, я что-то делаю не так, или гнусный компилятор шалит? template<typename T> class Test { public: char * test_field; }; template<typename T> class Test1:public Test<T> { public: Test1() { test_field=0; } }; Test1<int> x; Дает при попытке собрать в GCC (g++) : test.cc: In constructor 'Test1<T>::Test1()': test.cc:11: error: 'test_field' was not declared in this scope Следующие два варианта собираются без проблем: template<typename T> class Test { public: char * test_field; }; class Test1:public Test<int> { public: Test1() { test_field=0; } }; Test1 x; (У потомка убрана шаблонность) template<typename T> class Test { public: char * test_field; }; template<typename T> class Test1:public Test<T> { public: Test1() { this->test_field=0; } }; Test1<int> x; (Обращаемся к полю базового класса через оператор-селектор) Жалоба
Опубликовано 27 марта, 200818 г. comment_5294053 Не только гнусь, но ещё и Comeau C/C++ Online "шалит": Comeau C/C++ 4.3.9 (Mar 27 2007 17:24:47) for ONLINE_EVALUATION_BETA1 Copyright 1988-2007 Comeau Computing. All rights reserved. MODE:strict errors C++ C++0x_extensions "ComeauTest.c", line 9: error: identifier "test_field" is undefined test_field = 0; ^ 1 error detected in the compilation of "ComeauTest.c". Связаны эти "шалости", если мне не изменяет склероз, с поправками в стандарте С++2003. На вскидку статью не скажу, но идея в том, что до инстанцирования состав неявно зависимых имён не определён. Т.е. если ты перед строкой Test1<int> x; добавишь объявление test_field, то компилятор будет в непонятках, какое объявление нужно использовать. А в MSVC такие ситуации обрабатываются традиционно неправильно. :-) Я как-то попытался ихнюю GRETA под гнусью завести - так и не смог из за таких вот неявных зависимостей. Жалоба
Опубликовано 27 марта, 200818 г. comment_5296338 Читай вопрос внимательней - последний пример кода. :-) Жалоба
Опубликовано 27 марта, 200818 г. comment_5296703 А, ну да) На C++ курсе от SWSoft как–то раз это упоминалось Жалоба
Опубликовано 28 марта, 200818 г. comment_5297753 просто нужно явно указать неймспейс базового класса при обращении к атрибуту предка template<typename T> class Test { public: char * test_field; }; template<typename T> class Test1:public Test<T> { public: Test1() { Test<T> :: test_field=0; } }; Test1<int> x; Жалоба
Подскажите, пожалуйста, я что-то делаю не так, или гнусный компилятор шалит?
template<typename T> class Test { public: char * test_field; }; template<typename T> class Test1:public Test<T> { public: Test1() { test_field=0; } }; Test1<int> x;Дает при попытке собрать в GCC (g++) :
Следующие два варианта собираются без проблем:
template<typename T> class Test { public: char * test_field; }; class Test1:public Test<int> { public: Test1() { test_field=0; } }; Test1 x;(У потомка убрана шаблонность)
template<typename T> class Test { public: char * test_field; }; template<typename T> class Test1:public Test<T> { public: Test1() { this->test_field=0; } }; Test1<int> x;(Обращаемся к полю базового класса через оператор-селектор)