2012-06-27 55 views
8

我有這樣的代碼:默認模板參數:爲什麼編譯器抱怨沒有指定模板參數?

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() 

如果我讓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模板的實例。但是您需要<>來區分何時需要實例化。