编译运行代码时
#include <iostream>
struct A { A(int){} };
void foo( int ) { std::cout << "foo(int)" << std::endl; }
template< typename T >
struct S {
void bar() { foo( 5 ); }
void foobar() { T t = 5; foo(t); }
};
inline void foo( A ) { std::cout << "foo(A)" << std::endl; }
inline void foo( double ) { std::cout << "foo(double)" << std::endl; }
int main(int argc, char* argv[])
{
S<double> s0;
s0.bar();
s0.foobar();
std::cout << '\n';
S<A> s1;
s1.bar();
s1.foobar();
}
我得到输出(使用 g++ 4.8、clang++ 3.2 或 icpc 13.1)
foo(int)
foo(int)
foo(int)
foo(A)
虽然考虑到两阶段查找规则,最后两行对我来说非常有意义,但我希望foo(int) foo(double)
前两行。
似乎在这种情况下,foobar()
调用foo()
在实例化之前被查找,这是不可能的。有什么提示吗?