2013-07-29 4 views
0

템플릿을 사용하는 클래스가 있습니다. 다음과 같은 내용입니다.템플릿 클래스 비 템플릿 메소드 인자

template <typename T> 
class a 
{ 

public: 
    a(T arg); 
    a<T> func(a arg); // This seems to work, but... 
    a<T> func(a<T> arg); // ...should I be doing this instead? 

private: 
    T local; 
}; 

func의 두 가지 함수 템플릿에 유의하십시오. 두 가지 모두 컴파일됩니다 (물론 동시에는 아님). 그러나 어느 것이 정확합니까? 아니면 중요하지 않습니까? 내가 추측하고

a<float> b; 
a<int> c; 
a<int> d; 
d = c+ b; 

: 첫 번째, 나는이 class a는 인수가 예를 들어 나는이 작업을 수행 할 수 있습니다 ...이 첫 번째 경우, 다른 종류의 T 대신 사용할 수 있습니다 ...이라고 지정한 컴파일되지 않기 때문에 대답은 "아니오"입니다!

두 번째 경우에는 인수의 템플릿 형식이 동일해야합니다.

위에서 설명한 내용으로 인해 컴파일러가 실제로 a<T> func(a arg);a<T> func(a<T> arg);으로 해석한다고 생각합니다. 나 맞아? 클래스 템플릿 a에서

답변

2

a<All the tempalte args here>a<T>

그래서 모두 당신의 기능은 동일합니다 의미합니다.

당신은 또한 std::common_type<T, U>::type를 반환 고려할 수 있지만 귀하의 경우는 float에 대한 일반적인 유형 때문에 컴파일되지 않을 것이다 템플릿 함수

template <typename T> { 
class a { 
    template<typename U> 
    a<T> func(a<U> arg); 
} 

를 사용해야 다른 유형을 제공하려는 경우와 intfloat

a<float> x = a<int>(1) + a<float>(8) 
입니다

이 작동해야합니다.

관련 문제