作者mips (天行者路克好帅)
看板C_and_CPP
标题[问题] c++ 的物件使用一问
时间Wed Feb 8 19:58:00 2006
※ [本文转录自 Programming 看板]
请教各位程式设计的高手们,
我写c++的时候,遇到物件使用上的问题,
以下是我的code以及vc6与gnu c++的compile之错误讯息
class src
{
public:
src()
{
}
};
class ic: public src
{
public:
ic(src& s)
{
}
};
class mpd: public src
{
public:
mpd()
{
}
mpd(src& a)
{
}
mpd(src& a, int b)
{
}
};
void fun()
{
ic a(src());
ic b(mpd(a));
ic c(b);
}
int main(int argc, char* argv[])
{
ic a(src());
ic b(mpd(a, 1));
ic c(b);
return 0;
}
以白话来描述之,则是
我这段code一共有3个角色
src: 物件来源
mpd: 物件来源的一种,继承於src
ic: 物件内容,本身也可为物件来源
其中,物件内容(ic)可由物件来源(src)建构
ic::ic(src& s)
当然,mpd也是src的一种,因此物件内容
也可以由mpd来建构,例如
mpd m;
ic a(m); // works well
亦可由ic本身来建构(since ic extends src)
mpd m;
ic a(m);
ic b(a); // still works well
mpd可由两种方式建构,
一种是传入一个src,另一种是传入一个src和一个整数
mpd::mpd(src& a);
mpd::mpd(src& a, int b);
因此以下的code可以正确编译
src s;
mpd m(s);
ic a(m);
ic b(a);
但是重点在於,我将上述的code
转换成
src s;
ic a(mpd(s));
ic b(a);
的时候却会出现以下的错误讯息:
error C2664: '__thiscall ic::ic(class src &)' :
cannot convert parameter 1 from 'class ic (class mpd)' to 'class src &'
Context does not allow for disambiguation of overloaded function
以gnu c++的compiler则出现
a.cpp: In function `int main(int, char**)':
a.cpp:28: no matching function for call to `ic::ic(ic (&)(mpd))'
a.cpp:10: candidates are: ic::ic(const ic&)
a.cpp:13: ic::ic(src&)
但是若换成mpd当中的传入两个参数的constructor却能够compile
也就是
src s;
ic a(mpd(s, 1));
ic b(a);
我觉得相当困惑,为何会有这样的现象
麻烦各位高手若可以的话,
请提出您的看法,感激不尽!!
mips 敬上
※ 编辑: mips 来自: 140.113.241.36 (02/08 19:58)
1F:推 godfat:难倒我了…不过如果不用暂时物件就不会有错误了, 02/08 21:45
2F:→ godfat:也许暂时物件的型别还有特别规则吧 02/08 21:46
3F:推 UNARYvvv:temp object => const object 就这样 02/09 02:32