2012-06-27 21 views
8

私はこのコードを持っている:デフォルトのテンプレートパラメータ:なぜコンパイラはテンプレート引数を指定しないと不平を言うのですか?

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() 

では、テンプレート関数の引数ではなく、デフォルトのパラメータでテンプレートクラスの引数を指定する必要があるのはなぜですか?私は行方不明の微妙な点がありますか?

理由は、テンプレート引数の減算に失敗したためです。しかし、私は理由を知りたい。デフォルト引数AがクラステンプレートBのために仮定され

B<> b; 

+0

この質問のタイトルには単語がありませんか? – Pointy

+0

はい。単語を逃した - 不平を言う。それを追加しました。 – badmaash

+0

* [関数テンプレートのデフォルトテンプレート引数](http://stackoverflow.com/questions/2447458/default-template-arguments-for-function-templates)*の重複が考えられます。 –

答えて

7

正しい構文は、この(demo)です。 <>部分は、Bがクラステンプレートであることをコンパイラに伝え、デフォルトパラメータをテンプレート引数として使用するように指示します。

+0

私は参照してください。しかし、なぜテンプレート関数はこれを使わなくても動作します: 'b.foo <>()'? – badmaash

+1

@badmaash:それは動作しません:http://ideone.com/QhWgJ – Nawaz

+0

私の悪い。関数のデフォルトのテンプレートパラメータをサポートするg ++ 4.7.0について述べておきます。上記のコードは間違いなく機能します。 g ++ 4.7.0で実行してみてください。 – badmaash

0

あなたはBがテンプレートであることを言わなければならないので:あなたがいずれかの引数を指定しないとしても

B<> b; 

。ナワズは、すでに言及して

+0

実際には、テンプレートを必要とせずに、デフォルトの引数を持つテンプレートのインスタンスをコンパイラに伝えるには、 '<>'が必要です。しかし構文は正しいです。 –

1

正しい構文は、次のとおりです。

B<> b; 

理由はBはテンプレートがあるとB<>は、デフォルトの引数Aとテンプレートのインスタンス化であるということです。しかし、具体化するときに区別するためには<>が必要です。

関連する問題