У меня есть код С++, который больше не компилируется без опции -fpermissive. Это код приличия, который я не могу предоставить, но я думаю, что мне удалось извлечь простой тестовый пример, демонстрирующий проблему. Вот результат из g++
template_eg.cpp: In instantiation of 'void Special_List<T>::do_other_stuff(T*) [with T = int]':
template_eg.cpp:27:35: required from here
template_eg.cpp:18:25: error: 'next' was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
template_eg.cpp:18:25: note: declarations in dependent base 'List<int>' are not found by unqualified lookup
template_eg.cpp:18:25: note: use 'this->next' instead
Итак, вот код, который порождает проблему:
template<class T> class List
{
public:
void next(T*){
cout<<"Doing some stuff"<<endl;
}
};
template<class T> class Special_List: public List<T>
{
public:
void do_other_stuff(T* item){
next(item);
}
};
int main(int argc, char *argv[])
{
Special_List<int> b;
int test_int = 3;
b.do_other_stuff(&test_int);
}
Я не пытаюсь выяснить, как исправить код, чтобы он снова скомпилировался. Это просто вопрос изменения следующего (элемента) этого- > следующего (элемента) Я пытаюсь лучше понять, почему это изменение необходимо. Я нашел объяснение на этой странице: http://gcc.gnu.org/onlinedocs/gcc/Name-lookup.html Хотя это объяснение было полезным, у меня все еще есть некоторые вопросы. Не должен ли факт, что моя функция принимает T * (указатель на тип T), делает ее зависимой от аргумента шаблона. В моей собственной формулировке, не должен ли компилятор (gcc 4.7) понять, что функция next() находится в списке базового класса? Почему это необходимо перед этим-перед этим вызовом? Я заметил, что clang 3.1 демонстрирует такое же поведение, поэтому я предполагаю, что в стандарте С++ есть какое-то требование, требующее такого поведения. Может ли кто-нибудь объяснить это?