2017-05-05 5 views
3
template<typename T> 
struct A 
{ 
    template<typename U> 
    A() {} 

    template<typename U> 
    static void f() {} 
}; 

int main() 
{ 
    A<int>::f<int>(); // ok 
    auto a = A<int><double>(); // error C2062: type 'double' unexpected 
} 

この問題はコード内で明らかです。テンプレートクラスのテンプレートctorを呼び出す方法は?

私の質問は:

テンプレートクラスのテンプレートのctorを呼び出すためにどのように?

+2

明らかバイパス() :: 'である'これは不正な構文です。ヴィットリオが答えているように、これは何らかのラッパーなしでは不可能です。 –

答えて

5

は、クラスのコンストラクタを呼び出すことはできません。コンストラクタのテンプレート引数を呼び出しから推測できない場合、その特定のコンストラクタを呼び出すことは不可能です。あなたは何ができるか

は、ゼロ・オーバーヘッドの控除のために使用することができるタイプラッパーのいくつかの並べ替えを作成することです:

テンプレートのテンプレートのctorを呼び出す方法
template <typename T> 
struct type_wrapper { }; 

template<typename T> 
struct A 
{ 
    template<typename U> 
    A(type_wrapper<U>) {} 
}; 

int main() 
{ 
    auto a = A<int>(type_wrapper<double>{}); 
} 

live example on wandbox

3

クラス?

残念ながらそれは不可能です。テンプレート引数は、コンストラクタテンプレートに対して明示的に指定することはできません。

§17.5.2/5 Member templates [temp.mem]

(強調鉱山)

[注意:明示的なテンプレート引数リストが 関数テンプレート名を次のので、変換メンバ関数ので テンプレートとコンストラクタメンバ関数テンプレートが呼び出されます を使用せずに関数名を使用すると、これらの関数テンプレートの明示的なテンプレート 引数リストを提供する方法はありません。 -エンドノート]

関連する問題