2012-03-23 9 views
7

다음 코드로 인해 어려움을 겪고 있습니다. 기본적으로 클래스 Foo와 중첩 클래스 Bar가 있습니다. 이제는 클래스 Bar 객체의 포인터를 함수에 전달하려고하지만 컴파일되지 않습니다. 누구든지 이걸 도와 줄 수 있니? 고맙습니다.C++ 템플릿 함수가 템플릿 클래스를 매개 변수로 사용

template <typename T> 
struct Foo 
{ 
    struct Bar 
    { 
     T data_; 
    }; 
    Bar bar_; 
}; 

template <typename T> 
void func(Foo<T>::Bar* bar) // Why is this line wrong??? 
{ 
} 

int main() 
{ 
    Foo<int> foo; 
    foo.bar_.data_ = 17; 
    func(&foo.bar_); 
    return 0; 
} 
+0

의 중복 가능성 ([C++ 템플릿 인수를 추론 할 수 없습니다] http://stackoverflow.com/questions/6060824/c-template-argument-can로 -not-be-deduced) –

+0

(최소한, 복제본은 명백한'typename' 문제를 해결합니다. VC++는 어쨌든 평소대로 미끄러지게 할 것입니다) –

답변

14

을, 그 유일한 문제

func(&foo.bar_); 
아니다

도 있어야합니다.

func<int>(&foo.bar_); 

템플릿 기능 "func"을 (를) 호출했지만 그 유형을 추론 할 수 없기 때문입니다. 해당 유형이 없다면, 그것은 오류를 줄 것 같은

no matching function for call to 'func(Foo<int>::Bar*)' 
+2

+1을 참조하십시오. 정답. 더 큰 문제는 'T'를 추론 할 수 없으므로 명시 적으로 전달해야합니다. – Nawaz

+2

+1 나는 "깊은"대답을주는 신참을 좋아합니다! 참고로 여기에서 'T'를 추론 할 수 없다는 사실은 ** 비 추론 할 수없는 상황 **으로 알려져 있습니다. –

3

그것은 dependent name, 당신은 말할 필요 : 다음 서명 그러나

template <typename T> 
void func(typename Foo<T>::Bar* bar) // Why is this line wrong??? 
을 가질 필요가

template <typename T> 
void func(typename Foo<T>::Bar* bar) // Tell the compiler explicitly it's a type 
+2

Downvoter가 관심을 가져 주시겠습니까? – Flexo

+0

-1. 이 대답은 불완전하며 문제의 더 큰 문제를 해결하지 못합니다. 당신이 말한 것은 사실이지만'func (& foo.bar_)'는 어떻게 작동할까요? 여전히 그렇지 않습니다. – Nawaz

+0

@ Nawaz : 내 대답 – josephthomas

관련 문제