Например, следующий фрагмент кода компилируется с помощью gcc-4.9 и clang-602
class Base
{
public:
static void foo() {}
void badfoo(int i) {}
};
template <typename T>
class Derived : public Base
{
public:
void bar() { Base::foo(); }
void badbar() { Base::badfoo(); } // compiles ok
//static void badbar() { Base::badfoo(); } // compile error
//void worsebar() { Base::nonexist(); } // compile error
};
int main()
{
return 0;
}
Но прокомментированные строки не будут компилироваться.
Мои вопросы:
-
Почему
badbar()
компилируется, ноworsebar()
не работает? -
Если я изменяю
badbar()
на статичный, он не будет компилироваться, независимо от того, является лиbase::badfoo
статическим или нет. -
Знает ли стандарт что-либо о том, что следует проверять в этой ситуации? gcc4.4 фактически отказывается компилировать даже
badbar()
.
Обновление:
Проблема 1 объясняется рядом ответов, но, похоже, компиляторы иногда идут на лишнюю милю, чтобы проверить перегрузку, это происходит с gcc 4.4.3 и 4.8.2, но не 4.7.2 и 4.9.1.
Проблема 2: Как заметил Марко А., clang не будет компилироваться, но gcc4.9 все равно пройдет. Однако gcc4.2 и gcc4.4 оба отклоняют код, а ошибка, которую они жалуются, - это "не соответствующая функция", а не "вызов нестатического элемента без объекта" в clang. Кажется, нет никакого окончательного ответа на этот вопрос, поэтому я добавляю тег-адвокат языка, предложенный Даниэлем Фрейем.
Больше обновлений:
Я думаю, что для вопроса 2 ответ довольно ясен: до компилятора вопрос о том, будет ли добавление статической декларации изменить диагноз. Он варьируется от компилятора до компилятора и разных версий одного и того же компилятора. Языковой адвокат не появился, я собираюсь принять ответ Даниэля Фрея, поскольку он лучше всего объяснил первый вопрос. Но ответы от Marco A. и Hadi Brais также заслуживают внимания.