2012-02-09 191 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