2014-04-04 4 views
3

클래스 템플릿 외부의 클래스 템플릿 템플릿 함수가 될 수 있습니까? 구문은 무엇입니까? 코드에 따라클래스 템플릿 외부의 클래스 템플릿 템플릿 함수가 될 수 있습니까?

준다 unable to match function definition to an existing declaration 편집

#include <iostream> 

template <typename T> 
struct Test 
{ 
    template <typename S> 
    void test(const S & t); 

    //this works 
    //template<> void test(const double & t) { std::cout << t << "D \n"; } 

    T member; 
}; 

//this doesn't work 
template <typename T> 
template <> 
void Test<T>::test(const double & t) 
{ 
    std::cout << t << "D \n"; 
} 

int main() 
{ 
    Test<int> t; 
    t.test(7.0); 
} 

MSVC2010에서

답변에 제안 나는 조금 다르게 사용하기 때문에 내가 여기에, 오버로드를 사용할 수있는 방법입니다 :

#include <iostream> 

template <typename T> 
struct Test 
{ 
    template <typename S> 
    void test() { std::cout << "Any type \n"; } 

    template <> 
    void test<double>() { std::cout << "Double! \n"; } 

    T member; 
}; 

int main() 
{ 
    Test<int> t1; 
    Test<int> t2; 
    t1.test<float>(); 
    t2.test<double>(); 
} 

과 나는 struct 외부의 이중화를 원합니다.

왜 이런 식으로 사용합니까? 실제 시나리오에서는 내가 좋아하는 사용되는 팩토리 클래스 구축 :

Factory<SomePolicy> f; 
f.create<MyType>(arg1, arg2, ...) 

을 내가 헤더 파일을 오염하지 않습니다 특정 유형에 대한 create의 전문화가 필요합니다.

+0

빈'template <>'은 비어 있지 않은'template '을 따라갈 수 없습니다. 그래서 다음과 같이 쓸 수 있습니다 :'template <> template void Test :: test (const S & t) {/*...*/}'이것은 당신이 원하는 것이 아닙니다. 그리고 클래스 선언 내에서는 전문화를 선언하거나 정의 할 수 없습니다. – Constructor

답변

0

외부를 전문화하지 않고 내부 템플릿을 전문화 할 수 있다고 생각하지 않습니다. 그러나 부분 전문화를 사용할 수 있습니다.

편집 : 클래스 만 부분적으로 특수화 된 것으로 보입니다. 다시 한 번 나는 그것을 테스트하지 않았다. 당신은 더 찾을 수 있습니다 here

template <typename T, typename S> 
struct Test 
{ 
    void test(const S &s); 
}; 

template <typename T> 
struct Test<T, float> 
{ 
    void test (const float &s) 
    { 
     <<do something>> 
    } 
} 
+0

예제 코드에서'class' 대신'struct'를 사용하는 것이 합리적이라고 생각합니다. 그렇지 않으면 명시 적으로'public'을 명시해야합니다. – Brian

+0

답변 해 주셔서 감사합니다.하지만 좋지 않다고 생각합니다. 1) 이것은 비협조적입니다. 2) 2 개의 템플릿 인자를 가진 클래스 템플릿과 하나의 인자를 가진 클래스 템플릿과 템플릿 멤버 함수 인 – relaxxx

+0

@Brian 사이에는 큰 차이가 있습니다. 정확히 구조체를 사용했기 때문에 – relaxxx

0

내가 아는 한 당신은 할 수 없습니다. 그러나 당신은이처럼 test 기능을 오버로드 할 수 있습니다

당신이 원하는 것과 완전히 동일해야
template <typename T> 
struct Test 
{ 
    template <typename S> 
    void test(const S & t); 

    void test(const double &); // <-- Add this 

    T member; 
}; 

template <typename T> 
// template<> // <-- Remove this 
void Test<T>::test(const double & t) 
{ 
    std::cout << t << "D \n"; 
} 

.

+0

답변 해 주셔서 감사합니다. 안타깝게도 제 경우에는 작동하지 않습니다. 제발, 내 질문 편집을 참조하십시오. – relaxxx

관련 문제