2017-05-05 15 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

명백한 바이 패스 '인 :: ();'하지만 불법 구문입니다. 비토리오 (Vittorio)가 그의 대답에서 언급했듯이, 어떤 종류의 포장지 없이는 불가능합니다. –

답변

5

은 클래스 생성자를 호출 할 수 없습니다. 호출에서 생성자의 템플릿 인수를 추론 할 수 없으면 해당 특정 생성자를 호출 할 수 없습니다.

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

어떻게 템플릿의 템플릿의 ctor를 호출 : 당신이 할 수있는 일

제로 오버 헤드 공제에 사용할 수 있습니다 타입 래퍼의 일종을 만드는 것입니다 수업?

불행히도 불가능합니다. 생성자 템플릿에 명시 적으로 템플릿 인수를 지정할 수 없습니다.

§17.5.2/5 Member templates [temp.mem]

(강조 광산)

는 [주가 : 명시 적 템플릿 인수 목록이 기능 템플릿 이름을 따르며, 때문에 변환 멤버 함수 때문에 템플릿과 생성자 멤버 함수 템플릿을 호출 없이 함수 이름을 사용하는 경우 명시 적 템플릿 이 함수 템플릿에 대한 인수 목록을 제공 할 방법이 없습니다. - 엔드 노트]