3

重複の可能性:
空の括弧のセットを使用してデフォルトのコンストラクターを呼び出すときにエラーが発生しました

次のコードが問題なくコンパイルされるのはなぜですか?

MCl<char, a> tryout;

MCl<char, a> tryout();

「エラーC2228:「。ea」の左側にはクラス/構造体/共用体が必要です」が表示されますか?tryout()はデフォルトのコンストラクターの呼び出しではありませんか?

これが完全なコードです

template <class T, T myval> class MCl
{
public:
    T ea;
    MCl() : ea(myval)
    {
    }
};

int main()
{


    const char a = 'e';
    MCl<char, a> tryout;
    // MCl<char, a> tryout();

    cout << tryout.ea;

    return 0;
}
4

3 に答える 3

4
MCl<char, a> tryout();

関数tryoutを宣言します。これは何も受け取らず、を返しますMCl<char, a>

n3337 8.2 / 1

選択は、パラメーター名を囲む冗長な括弧のセットを使用した関数宣言と、初期化子として関数スタイルのキャストを使用したオブジェクト宣言のどちらかです。6.8で述べたあいまいさの場合と同様に、解決策は、宣言である可能性のある構成を宣言と見なすことです。[注:宣言は、非関数スタイルのキャスト、初期化を示す=、またはパラメーター名の前後の冗長な括弧を削除することによって、明示的に明確にすることができます。—エンドノート]

于 2012-10-06T11:52:32.937 に答える
4
MCl<char, a> tryout();

これは、関数プロトタイプまたはvoidコンストラクターによるインスタンス化のいずれかとしてあいまいです。このあいまいさは、「最も厄介な解析」として完全にカバーされています。これは、C++03標準自体でも説明されています。

ただし、C ++ 11では、統一された初期化によってこれを明確にするための新しい構文が導入されていることに言及しない傾向があります。この新しい構文では、のインスタンス化は次のMClように表されます。

MCl<char, a> tryout{};
于 2012-10-06T11:53:16.663 に答える
0

変数を宣言します。

MCl<char, a> tryout;    // uses default constructor if user defined one.
                        // If compiler generated constructor uses value-initialized
                        // of members which for POD types means uninitialized.

関数への前方宣言です(tryoutと呼ばれます):

MCl<char, a> tryout();

あなたが欲しかったのはおそらく:(C++01のC++03については、Mike Kwanを参照してください)。

MCl<char, a> tryout  = MCl<char, a>(); // uses default constructor if user defined one.
                        // If compiler generated constructor uses zero-initialized
                        // of members which for POD types means 0 is placed in them.
于 2012-10-06T16:07:18.627 に答える