2012-06-27 4 views
8

나는이 코드를 가지고 : 나는 같은 템플릿 '서명'와 템플릿 기능으로 foo()을하면기본 템플릿 매개 변수 : 컴파일러가 템플릿 인수를 지정하지 않는 것에 대해 불평하는 이유는 무엇입니까?

struct A{}; 

template<class T = A> 
struct B { 
    void foo() {} 
}; 

B b; //Error: missing template arguments before 'b' 
    //Error: expected ';' before 'b' 
    //More errors 
b.foo() 

를, 컴파일러는 템플릿 인수를 지정하지 않는 불평하지 않습니다

struct A {}; 

struct B { 
    template<class T = A> 
    void foo() {} 
}; 

B b; //OK 
b.foo() 

그렇다면 왜 기본 매개 변수를 사용하여 템플릿 클래스에 대한 인수를 지정해야하지만 템플릿 함수에는 지정하지 않아야합니까? 내가 누락 된 미묘한 점이 있습니까?

이유는 템플릿 인수 공제 실패 때문입니다. 하지만 그 이유를 알고 싶습니다.

+0

이 제목의 제목에서 누락 된 단어가 있습니까? – Pointy

+0

예. 단어를 놓친 - 불평. 그것을 추가했습니다. – badmaash

+0

* [함수 템플릿의 기본 템플릿 인수] (http://stackoverflow.com/questions/2447458/default-template-arguments-for-function-templates) *. –

답변

7

올바른 구문이 (demo)입니다 :

B<> b; 

인수 A이 클래스 템플릿 B에 대한 가정 기본. <> 부분은 B이 클래스 템플릿임을 컴파일러에 알리고 기본 매개 변수를 템플릿 인수로 사용하도록 요청합니다.

+0

나는 본다. 하지만 왜 템플릿 함수는'b.foo <>()'가 없이도 작동합니까? – badmaash

+1

@badmaash : 그건 작동하지 않습니다 : http://ideone.com/QhWgJ – Nawaz

+0

내 잘못입니다. 함수에 대한 기본 템플릿 매개 변수를 지원하는 g ++ 4.7.0을 언급해야합니다. 그래서 위의 코드는 확실히 작동합니다. g ++ 4.7.0을 사용해보십시오. – badmaash

0

당신이 B 템플릿입니다 '라고해야하기 때문에 : 당신은 모든 인수를 지정하지 않아도

B<> b; 

. 나와 즈는 이미 언급으로

+0

사실, 컴파일러에게 템플릿을 원하지는 않지만, 기본 인자를 가진 템플릿을 인스턴스화하기 위해서는'<>'가 필요합니다. 그래도 구문은 정확합니다. –

1

올바른 구문은 다음과 같습니다

B<> b; 

이유는 B 템플릿이고 B<> 기본 인수 A와 템플릿의 인스턴스화 것입니다. 그러나 인스턴스화를 원할 때 차별화하려면 <>이 필요합니다.