很好奇的一个模板实例化的问题

DraculaW 2007-08-14 04:15:21
template<typename T, typename U>
class Test
{
public:
void a(T)
{
}

void a(U)
{

}
};

Test<int, int> test;

test.a(0);

这个时候 这个a(0)应该连到哪一个上面去呢.....
...全文
158 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fish6344 2007-08-14
  • 打赏
  • 举报
回复
对于你的如下代码:
template<typename T, typename U>
class Test
{
public:
void a(T){}
void a(U){}
};
在编译器未检索到有使用该模板的代码以前,编译器将不作实例化,仅作语法检测。

编译器检索到:
Test<int, int> test;语句时,开始具现出该模板的实体如下:

template<typename int, typename int>
class Test
{
public:
void a(int){}
void a(int){}
};

等同于你有如下声明:
class Test
{
public:
void a(int){}
void a(int){}//编译时错误,函数名'a(int)'重定义!
};

相信你也意识到了错误的原因。所以如下语句:
test.a(0);
根本不存在绑定那一个的问题!

关键是,对于非模板类,编译器在类声明的结束处(最后一个’}’处),就开如决义具现出类声明实体,而对于类模板这个操作要推迟到使用的时候才具现出类声明实体。
DraculaW 2007-08-14
  • 打赏
  • 举报
回复
这个应该编译通不过
因为 会对Test这个函数定义两次....
不知道标准或者什么上面有说法没有
  • 打赏
  • 举报
回复
g++
error: `void Test<T, U>::a(U) [with T = int, U = int]' and `void Test<T, U>::a(T) [with T = int, U = int]' cannot be overloaded
DraculaW 2007-08-14
  • 打赏
  • 举报
回复
当然没有通过啊 所以我才来问问...
loops 2007-08-14
  • 打赏
  • 举报
回复
你在哪个编译器上编译通过了?
taodm 2007-08-14
  • 打赏
  • 举报
回复
自己编译试一下嘛。
如果能编译过的话,你在2个函数里加打印,执行一下嘛。
举手之劳,为啥不自己试?

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧