以下代码编译良好:
#include <cstdio>
//namespace N {
void f( int x ) { printf( "f( int ) called\n" ); }
void f( double x ) { printf( "f( double ) called\n" ); }
//}
template < typename T > inline void g( const T& t ) {
// N::f( t );
f( t ); }
struct X {};
//namespace N {
void f( const X& x ) { printf( "f( const X& ) called\n" ); }
//}
int main() {
g( 1 );
g( 1.2 );
g( X{} );
}
但是如果我在命名空间中定义 f()s,例如通过取消注释上述代码,那么编译器会生成一个错误:
t.cpp:11:5: error: no matching function for call to 'f'
N::f( t );
^~~~
t.cpp:25:5: note: in instantiation of function template specialization 'g<X>' requested here
g( X{} );
^
t.cpp:4:10: note: candidate function not viable: no known conversion from 'const X' to 'int' for 1st argument
void f( int x ) { printf( "f( int ) called\n" ); }
^
t.cpp:5:10: note: candidate function not viable: no known conversion from 'const X' to 'double' for 1st argument
void f( double x ) { printf( "f( double ) called\n" ); }
^
这是为什么?