Visual Studio 2005 に次の C++ コードがあります...
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 のインスタンスではなく、"other" 変数の宣言が関数宣言 (Other を返し、Derived パラメーターを受け取る) として解釈されるためだと判断しました。(VS6はコンストラクタを見つけてコンパイルしてくれますが、標準のC++は苦手なのでVS2005と比べると信用できません)
私が行った場合...
Other other(static_cast<Base&>(Derived()));
...またはコピー初期化を使用すると、正常に動作します。しかし、Derived() インスタンスが単独で Base から派生していること、またはコンストラクター パラメーターでポリモーフィズムを試みる代わりに関数宣言を優先していることがわからないようです。
私の質問は、これは標準的な C++ の動作ですか、それとも VS2005 固有の動作ですか? したほうがいい...
Other other(Derived());
... 標準 C++ でローカル インスタンスを宣言しますか、それとも関数を宣言する必要がありますか?