我有以下的C++代码在Visual Studio 2005 ...C++:当类构造函数有一个多态参数时,为什么VS2005将本地实例的直接初始化解释为函数?
class Base {};
class Derived : public Base {};
class Other {
public:
Other(const Base& obj) {}
void test() {}
};
int _tmain(int argc, _TCHAR* argv[])
{
Other other(Derived());
other.test();
return 0;
}
...编译失败,并给出:
test.cpp(19) : error C2228: left of '.test' must have class/struct/union
我已经通过了一些测试来确定,出现这种情况是因为“其他”变量的声明被解释为一个函数声明(返回一个Other并采用Derived参数),而不是使用单参数构造函数的Other实例。 (VS6发现构造并进行编译罚款,但它并不擅长的C++标准,所以我不相信它比VS2005)
如果我做...
Other other(static_cast<Base&>(Derived()));
...或者使用复制初始化,它工作正常。但似乎并没有看到Derived()实例是从Base派生的,或者它优先考虑函数声明,而不是尝试构造函数参数的多态性。
我的问题是:这是标准的C++行为,还是这个VS2005的特定行为?应该...
Other other(Derived());
...在标准C++中声明一个本地实例,还是应该声明一个函数?
FYI,这个问题被称为“最让人头疼的解析” – 2010-02-04 00:35:24
你错过了'Other'类的一些分号,但这不是你问题的一部分... – 2010-02-04 03:21:03