例如,以下代码段使用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;
}
Run Code Online (Sandbox Code Playgroud)
但注释掉的行不会编译.
我的问题是:
为什么badbar()编译但worsebar()不编译?
如果我badbar()改为静态,它也不会编译,无论是否base::badfoo是静态的.
标准是否说明了在这种情况下应该检查什么?gcc4.4实际上甚至拒绝编译badbar().
更新:
问题1已被许多答案解释,但似乎编译器有时会更加努力地检查过载,它发生在gcc 4.4.3和4.8.2,而不是4.7.2和4.9.1.
问题2:正如Marco …