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

全部博文(158)

文章存档

2012年(158)

我的朋友

分类: C/C++

2012-11-20 11:11:41

namespace test {
    template void foo( void )
    {
    }
}
template<> void test::foo( void )
{
}

使用 vc2005 竟然编译通过了
使用 gcc3.4.2 报:specialization of `template void test::foo()' in different namespace.
阅读(665) | 评论(4) | 转发(0) |
给主人留下些什么吧!~~

网友评论2012-11-20 11:12:39

anonymous
用VC7试了一下
namespace test1{  
   using namespace test;  

   template<>  
  void foo<int>( void ) {
  }  
}

会给error不等同你给的例子, 全局空间和名字空间好像并没有一事同人的处理.

对于为什么特化就不能这样写, 我自己猜想可能是这样:
因为namespace是属于mangling的一部分, 而当编绎器遇到特化调用时需要在当前指的名域表内找一个对应的原型mangling的名字,.
如:template<typename T> void foo();可能是fo

网友评论2012-11-20 11:12:29

anonymous
你的结论是基于规范条款推得还是基于编绎理论得到的呢?
为什么模版特化就不能这样写?

网友评论2012-11-20 11:12:22

周星星
第一段代码肯定是可以的,因为在同一个名字空间内嘛
第二段代码和我举的例子一样呀,只是把全局空间换成了名字空间test1

网友评论2012-11-20 11:12:14

anonymous
为什么不对呢?
这样
namespace test{
   template<> void foo<int>( void )
  {
  }
}

namespace test1{
   using namespace test;
   template<> void foo<int>( void )
  {
  }
}   
应该可以吧?