10

私はこのコードを持っています:

struct A{};

template<class T = A>
struct B {
    void foo() {}
};

B b; //Error: missing template arguments before 'b'
     //Error: expected ';' before 'b'
     //More errors
b.foo()

同じテンプレート「署名」を使用foo()してテンプレート関数として作成すると、コンパイラはテンプレート引数を指定しないことについて文句を言いません。

struct A {};

struct B {
    template<class T = A>
    void foo() {}
};

B b; //OK
b.foo()

では、なぜテンプレート クラスの引数を既定のパラメーターで指定する必要があるのに、テンプレート関数の引数を指定する必要がないのでしょうか。私が見逃している微妙な点はありますか?

その理由は、確かにテンプレートの引数推定の失敗によるものです。しかし、私はその理由を知りたいです。

4

3 に答える 3

7

正しい構文は次のとおりです ( demo ):

B<> b; 

Aクラス テンプレートには、デフォルトの引数が想定されますB<>パーツはコンパイラにそれがクラス テンプレートであることを伝え、B既定のパラメーターをテンプレート引数として受け取るように要求します。

于 2012-06-27T17:01:25.443 に答える
1

Nawaz が既に述べているように、正しい構文は次のとおりです。

B<> b;

その理由は、それBB<>テンプレートであり、デフォルトの引数を使用したテンプレートのインスタンス化ですA。ただし<>、インスタンス化が必要な場合は区別する必要があります。

于 2012-06-27T17:05:13.763 に答える
0

あなたはそれBがテンプレートだと言わなければならないので:

B<> b;

引数を指定したくない場合でも。

于 2012-06-27T17:02:34.557 に答える