Chinaunix首页 | 论坛 | 博客
  • 博客访问: 919609
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

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 void foo( T )
    {
        cout << "test" << endl;
    }

    template void bar( T t )
    {
        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 void foo( T n )
{
    print("foo");
    print(n);
}

void print(int a){}       

int main(int argc, char **argv)
{
    foo( 1 );
}

这段代码能够通过GCC3.4.2和VC++8.0,但通不过GCC4.1

阅读(804) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

网友评论2012-11-23 15:11:41

空见
其实不用看inside c++ object model这么难,几乎任何一本好的c++入门书籍都会提到参数相关作用域查找的问题,写的比较清楚的是<C++标准程序库自修教程与参考手册>,候老翻译的

网友评论2012-11-23 15:11:33

cadinfo
有点意思,inside c++ object model好像没有提到这个?或者是我看的不够详细。