【发布时间】:2023-03-14 20:20:01
【问题描述】:
#include <iostream>
void foo()
{
std::cout << "global foo()" << std::endl;
}
struct A {
void foo()
{
std::cout << "A::foo()" << std::endl;
}
};
struct B : public A {
void call()
{
foo();
}
};
int main(int argc, char **argv )
{
B b;
b.call();
return 0;
}
这给了expected result:
A::foo()
但是在更改两行之后(B 类为模板):
#include <iostream>
void foo()
{
std::cout << "global foo()" << std::endl;
}
struct A {
void foo()
{
std::cout << "A::foo()" << std::endl;
}
};
template <typename T> // change here
struct B : public T {
void call()
{
foo();
}
};
int main(int argc, char **argv )
{
B<A> b; // and here
b.call();
return 0;
}
global foo()
并且使用this-> 不是一个选项,因为我正在尝试创建一个“后备”机制。
【问题讨论】:
-
call() { T::foo(); }可以使用吗?它有效。 -
从
B::call拨打T::foo();怎么样? -
与 11 Beta 相比,它运行良好。调用 A::foo()。不确定是否可以考虑 beta 编译器。
-
在 VS11 Beta 中,调用 ::foo() 调用全局函数,而 foo() 调用 A::foo()。
-
@elmo:这可能对阅读gcc.gnu.org/onlinedocs/gcc/Name-lookup.html很有趣