2016-08-10 3 views
4

は、クラスのコンストラクタの引数の型についてはテンプレートクラスFooメソッドの引数は "Foo&"で、 "Foo <T>&"は同じですか?

template <typename T> 
struct Foo { 
    Foo(const Foo<T>& other) {} 
}; 

は、const Foo<T>&const Foo&この文脈でも同じです考えてみましょうか?私はいつも、後者はFoo<int> f = Foo<float>()のために呼び出すことができ、前者はできないと思っていません。しかし、今私はそれがそうであるかどうか分からない。

+1

[C++テンプレート引数リストを省略したときの違い](http://stackoverflow.com/questions/3690506/difference-when-omitting-the-c-template-argument-list) – LogicStuff

+0

は既に回答としてはい、それは合法です。 'class Foo'と' class Foo 'の両方を持つことができないのであいまいではありません。 – peterchen

答えて

8

クラステンプレート内で、クラステンプレートパラメータは、すべてのインスタンス化に対して1つの固有の意味を持ちます。つまり、Foo<int>T==intであり、テンプレート化された識別子はFoo<int>::Foo(const Foo<int>& other)です。

しかし、追加テンプレートパラメータを持つことが可能です:

template <typename T> 
struct Foo { 
    template <typename U> 
    Foo(const Foo<U>& other) {} 
}; 

TUと異なる場合があります。

6

はい、同じです。

これは、注射クラス名が原因です。クラス名はすべてのクラスのスコープに挿入され、名前の参照がわかりやすく機能します。テンプレートクラスの型名としてinject-class-nameを使用した場合は、テンプレート名の後に<>[temp.local]/1)で囲まれたテンプレートパラメータに相当するので、FooFoo<T>に相当します。

関連する問題