2012年(158)
分类: C/C++
2012-11-23 15:10:30
编译测试 by g++3.4.2 and vc++8.0
#include
using
namespace std;
class A
{
};
void foo( A )
{
cout << "global"
<< endl;
}
void foo( int )
{
cout << "global"
<< endl;
}
namespace test
{
// using ::foo;
template
{
cout << "test" << endl;
}
template
{
foo( t
);
}
}
int main( void )
{
A a;
test::bar( a ); //
输出 global
int b = 0;
test::bar( b ); // 输出 test
return
0;
}
----------------------------------------------
终于想起来,当年 hpho
曾经说过,函数的参数所在的域 和 函数所在的域 是同等对待的,所以A所在的全局名字空间中的foo也在候选列中。
感谢
感谢
感谢
----------------------------------------------2007-01-30日补充
当传入模板函数的模板参数是一个基本类型(fundamental type)的时候,由于基本类型不具有关联名字空间和类域(associated
namespaces and
classes),所以没有额外的空间进行名字查找,只进行默认的名字查找(其搜索范围是在名字被使用之前),因此要求在使用之前要有函数的声明存在。
如果模板参数是非基本类型,比如是一个类类型,则除了默认的查找范围外,还可以查找这个类的类域以及这个类所在的名字空间等关联空间。所以,函数的声明无论是在类定义之前还是之后都处于名字搜索空间内都可以被找到。
void
print(const char *){}
template
{
print("foo");
print(n);
}
void print(int a){}
int main(int argc, char **argv)
{
foo( 1
);
}
这段代码能够通过GCC3.4.2和VC++8.0,但通不过GCC4.1