2

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++ でローカル インスタンスを宣言しますか、それとも関数を宣言する必要がありますか?

4

3 に答える 3

3

はい、これは標準的な動作です。このC++FAQ-liteエントリを参照してください。

標準によると、これは:

Other other(Derived());

Otherを返し、パラメータとしてDerivedを返し、パラメータを持たない別の関数を受け取る関数の関数宣言として解釈されます。これを修正するには、次を使用できます。

Other other = Other(Derived());
于 2010-02-04T00:10:27.540 に答える
2

質問のタイトルに「多態性パラメーター」と記載されていますが、実際には、これはすべて多態性パラメーターとはまったく関係ありません。C++ では、指定した「引数」がポリモーフィックであるかどうかに関係なく、問題のある宣言が関数を宣言します。

いつものように、追加のペアを使用し()て問題を回避できます

Other other((Derived())); // now it is an object, not a function

Derived()次のように、パーツを式に変換するために他の方法を使用することもできます。

Other other((const Derived&) Derived()); 

また

Other other(((void) 0, Derived())); 
于 2010-02-04T00:20:43.163 に答える
1

私はVS2008とGCCであなたの例を試しましたが、それはそこでも起こります。

そのように見えるのは、その構文が実際には次の宣言で関数ポインタとしてotherを宣言しているということです。

Other other(Derived (*)(void))

正しい動作は、初期化を使用することです。

Other other = Derived();
于 2010-02-04T00:13:04.093 に答える