2012-02-09 193 views
2

有這樣的代碼:參考模板參數功能模板

#include <iostream> 

template<const double& f> 
void fun5(){ 
    std::cout << f << std::endl; 
} 

int main() 
{ 
    const double dddd = 5.0; 
    fun5<dddd>(); 
    return 0; 
} 

編譯過程中編譯器錯誤:

$ g++ klasa.cpp -o klasa 
klasa.cpp: In function ‘int main()’: 
klasa.cpp:11:10: error: ‘dddd’ cannot appear in a constant-expression 
klasa.cpp:11:16: error: no matching function for call to ‘fun5()’ 
klasa.cpp:11:16: note: candidate is: 
klasa.cpp:4:6: note: template<const double& f> void fun5() 

爲什麼將「DDDD」作爲模板參數不工作,應該做什麼使其工作?

回答

6

參考和指針模板參數必須有外部連接(或內部聯動,用於C++ 11,但需要靜態存儲持續時間)。所以,如果你必須使用dddd用作模板參數,你需要把它移動到全球範圍,使其extern

extern const double dddd = 5.0; 
int main() 
{ 
    fun5<dddd>(); 
    return 0; 
} 
+0

你不需要使它成爲'extern';正如你所說,它可以有內部聯繫。 – 2012-02-09 21:08:31

+0

@MikeSeymour:從理論上講,是的,但二者gcc和鐺拒絕,如果'extern'省略:( – kennytm 2012-02-09 21:12:43

+1

克++ 6.1接受 '的extern const的雙DDDD = 5.0;' 或只是 '雙DDDD = 5.0;',然而「常量雙DDDD = 5.0;」不被接受(在全局區所有這些定義在功能主要) – scdmb 2012-02-09 21:14:13

1

你可能誤解了模板的目的。模板參數(尖括號之間的東西)應該是類型或整數(儘管某些實現允許使用浮點類型)。

就你而言,最好宣佈fun5void fun5(double& f),並稱之爲fun5(dddd)

+2

這是不實際的情況下,我只是想看看函數模板如何與作爲模板參數引用工作。 – scdmb 2012-02-09 21:00:45