рассмотрим следующий код:
template<class T>
class Base {
public:
void doSomething(){}
};
template<class T>
class Derived : public Base<T> {
public:
void doMore() {
doSomething(); //Affected line
}
};
В строке, прокомментированной «затронутой строкой», g++ (4.7) говорит:
test.cc:11:16: error: there are no arguments to ‘doSomething’ that depend on a template parameter, so a declaration of ‘doSomething’ must be available [-fpermissive]
Теперь мне интересно:
- Если бы параметра шаблона T не было, этой ошибки не возникло бы. В чем разница?
- g++, очевидно, может решить эту проблему (если я добавлю -fpermissive, он отлично скомпилируется). Я предполагаю, что g++ пытается сделать для меня наилучший опыт как для "пользователя" (программиста). Каковы преимущества для меня, когда g++ не принимает этот код?
Спасибо! Натан
this->doSomething()
(илиBase<T>::doSomething()
), так какdoSomething()
зависит от типаT
. - person hmjd   schedule 29.05.2012this->
? - person Asha   schedule 29.05.2012this->
сообщает компилятору, что имя является членом, поэтому поиск имени откладывается до фазы 2 (создание экземпляра), когда известен тип базового класса и видны объявления его членов. - person Jonathan Wakely   schedule 29.05.2012