2013-05-02 2 views
2

는 다음의 C++ 코드 고려해특수 철골 구조 템플릿 반원 특성화

template <int K> 
struct KData 
{ 
    float data[K]; 
}; 

template<int K> 
class KClass 
{ 
public: 
    typedef KData<K> Data; 
    Data m_data; 

    Data square() 
    { 
     Data result; 
     for(int i = 0; i < K; ++i) 
      result.data[i] = m_data.data[i] * m_data.data[i]; 
     return result; 
    } 

    // Specialization for K = 2 
    template<> 
    KClass<2>::Data square(); 
}; 

template<> 
KClass<2>::Data KClass<2>::square() 
{ 
    Data result; 
    result.data[0] = m_data.data[0] * m_data.data[0]; 
    result.data[1] = m_data.data[1] * m_data.data[1]; 
    return result; 
} 

int main() 
{ 
    KClass<2> c; 
    c.m_data.data[0] = c.m_data.data[1] = 1.f; 
    c.square(); 

    return 0; 
} 

그것을 갖는 템플릿 데이터 부재 ('M_DATA') 및 데이터 부재에 어떤 연산을 수행하는 방법을 가지고 상기 'KCalss' ('광장()'). 제가하고 싶은 것은 예를 들어 K = 2 인 경우에 'square()'의 특수화를하는 것입니다.

main.cpp:23:14: error: explicit specialization in non-namespace scope 'class KClass'

main.cpp:24:5: error: 'Data' in 'class KClass<2>' does not name a type

내가 잘못 무엇인지 어떤 생각 : 4.6.7이나 4.7.2로 컴파일하려고

다음과 같은 오류를 준다? 사전에

감사합니다.

=== 편집 === 내가 찾은 해결 방법뿐만 아니라 템플릿으로 방법 ') (광장'두 번째를 선언하는 것입니다

: 그것은 잘 작동

template<int K2> 
typename KClass<K2>::Data square(); 

만 허용 사용자가 전화를 'aquare() 클래스에서 다른 템플릿 매개 변수, 예를 들면 통과 :

KClass<2> c; 
c.square<3>; 

은 "정의 참조하는"오류 연결 준다.

=== EDIT (SOLUTION) ===

좋아,이 솔루션은 생각보다 간단했다. 템플릿 선언을 제거하기 만하면됩니다.

이 필요하지 않습니다.

+0

VC++ 2010에서 컴파일됩니다. – Yola

답변

1
template<> 
KClass<2>::Data KClass<2>::square() 
       ^^^^^^^^ 
{ 

는 당신이를 제거해야합니다. 이것은 멤버 함수를 어떻게 전문화하는 것이 아닙니다. 멤버 함수는 클래스 범위에서 특수화 할 수 없습니다. 클래스 선언의 주변 네임 스페이스 내에서 특수화되어야합니다.

template<> 
KClass<2>::Data square(); 
+0

예, 내 잘못입니다. 그러나 그것은 단지 오류의 마지막 줄을 해결합니다 : "main.cpp : 29 : 24 : 오류 : 'square'는 템플릿 함수가 아닙니다. – Monfico

+0

@Monfico 제 잘못입니다. 편집을 참조하십시오. – stardust