2010-03-23 8 views
3

나는 다음과 같은 패턴이 있습니다겹침 C++ 템플릿

template <int a, int b> 
class MyClass 
{ 
public: 
    template <int c> 
    MyClass<a, c> operator*(MyClass<b, c> const &other) const; 
}; 

// ../.. 

template <int a, int b> template <int c> 
MyClass<a, c> MyClass<a, b>::operator*(MyClass<b, c> const &other) const //< error here 
{ 
    MyClass<a, c> result; 
    // ..do stuff.. 
    return result; 
} 

그것은 오류 메시지가

오류 C2975 컴파일하지 않습니다. 오류 C2975 : 'DOM'에 대한 잘못된 인수 템플릿은 'MyClass에'

내가 template <int c, int d>으로 template <int c>를 교체하고 accordignly를 사용하는 경우, 그것은 잘 작동합니다. 하지만 d의 값을 b과 같게하고 싶습니다.

내 질문 :

  1. 예제가 작동하지 않는 이유는 무엇입니까?
  2. db과 동일하게 적용하려면 어떻게해야합니까?

감사합니다.

+1

"겹쳐 쌓인"경우 거의 +1입니다. C++ 템플릿에서 일반적으로 사용되는 문구입니까? – Thilo

+1

템플릿을 인스턴스화하는 코드를 보여줄 수 있습니까? 숫자 템플릿 매개 변수가 컴파일시 정수 여야하는 경우 매개 변수 (예 :'int number = stuff(); MyClass <1,number> 건)에 변수를 사용하려고하는 것 같습니다. –

+0

@Thilo : 나는 정말로 모른다, 그것이 틀리다. @ 마이크 : 전적으로 동의하지만, 아직 그것을 instanciate하지 않습니다. – gregseth

답변

5

다음 코드는 나를 위해 정상적으로 컴파일됩니다.

  1. 당신은 임시에 대한 참조를 반환하는 : 코드에서 것을

    template <int a, int b> 
    struct MyClass 
    { 
        template <int c> 
        MyClass<a, c> operator*(MyClass<c, b> const &other) const; 
    }; 
    
    template <int a, int b> template <int c> 
    MyClass<a, c> MyClass<a, b>::operator*(MyClass<c, b> const &other) const 
    { 
        MyClass<a, c> result; 
        return result; 
    } 
    
    int main() 
    { 
        MyClass<1, 2> a; 
        MyClass<3, 2> b; 
        a * b; 
    } 
    

    참고.

  2. operator *은 비공개이므로 클래스 외부에서 액세스 할 수 없습니다.

실제 코드를 게시하고 오류의 줄을 표시하십시오.

+0

코드를 좀 더 정확하게 편집했습니다. 참조에 대한 팁 주셔서 감사합니다. 예를 컴파일하면 내 클래스의 메서드 본문 (!)을 정의하면 예외가 아닙니다. 'class' 대신'struct' 키워드를 사용하는 이유는 무엇입니까? – gregseth

+0

'struct'의 기본 접근 모드는'public'입니다. 따라서 예제에서 공간을 절약 할 수 있습니다;) –

+0

이 코드는 이제'.. .. stuff ..' 부분을 제외하고는 당신 코드와 동일합니다. 아마도 오류가 있습니까? ('struct'를 사용하면 멤버를 public으로 만들지 만 그 외의 것은'class'와 완전히 같습니다.) –