2011-09-16 2 views
6

나는 C++ 이름 축소 코드에 대한 몇 가지 테스트 케이스를 작성하고 있는데, 이것을 컴파일하려고하면 이상한 오류가 발생한다. (다음은 병리학 적으로 나쁜 C++ 코드이므로 실제로 사용하지 않을 것이다.)C++ 템플릿 질문

"typetest.cpp", line 165: error: nontype "Oog<T, U>::Huh<F>::Wham [with F=T]" 
    is not a template 

어떤 아이디어를 내가 해결할 수있는 방법을 다음과 같이

template<class U, class V> 
class TStruct 
{ 
    U u; 
    V v; 
public: 
    void setU(const U& newu) {u = newu; } 
}; 

template<class T, class U> 
class Oog 
{ 
    T t; 
    U u; 

public: 
    Oog(const T& _t, const U& _u) : t(_t), u(_u) {} 
    void doit(TStruct<T,U> ts1, TStruct<U,T> ts2, U u1, T t1) {} 

    template<class F> 
    class Huh 
    { 
     F f; 
    public: 

     template<class V> 
     class Wham 
     { 
      V v; 
     public: 
      Wham(const V& _v) : v(_v) {} 
      void joy(TStruct<T,V> ts1, U u, F f) {} 
     }; 
    }; 
    int chakka(const Huh<T>::Wham<U>& wu, T t) {} // error here 
}; 

오류가 무엇입니까?

답변

7

올바른 선으로해야한다,

int chakka(const typename Huh<T>::template Wham<U>& wu, T t) ... 
    it's a type ^^^^^^^^   ^^^^^^^^ indicate that 'Wham' is a template 

[참고 : g++ is quite helpful in this case :)]

당신은 허의 왬의 멤버 템플릿 될 것이라고 그것을 말할 필요
+1

감사합니다. 나는'typename'에 대해서 알고 있었지만,'template' 키워드를 그런 식으로 사용해야한다는 것을 모르고있었습니다. –

+0

+1 : 좋은 답변입니다. 이번 주에 적어도 두 번이나! : D –

+0

@Tomalak, 당신은'좋은 대답'코멘트를 주며, 누군가가 그것을 반대하면 당신의 투표/코멘트를 다시받습니다 !! – iammilind

2

:

const Huh<T>::template Wham<U> & 
+1

여전히'typename' (적어도 [gcc complains] (http://www.ideone.com/jjasO))이 누락되었습니다. – iammilind

+1

@ iammilind 네, 저에게 일어난 일이 아닙니다. 내가 필요하다고 확신하기 전에 잠시 동안 당신의 대답을 응시해야했습니다. –

-1

충분해야합니다 (종속 유형으로 인해 문제가 발생 함)

int chakka(const typename Huh<T>::Wham<U>& wu, T t) {}

+0

그렇지 않습니다. 거기 도착! (게시하기 전에 답변을 시도해야합니다.) –

+0

흠 .. 사실 나는 그것을 시도했습니다. 나는 VS 2010이'template' 키워드를 필요로하지 않는다고 가정합니다. – Werolik

+1

VS 2010에서 nextr downvoting 전에 시도하십시오. – Werolik