template <int x,int y>class add {public: static constexpr int ret = x + y;};constexpr int addFunc(const int x,const int y) { return add<x,y>::ret;}int main() { const int x = 1; const int y = 2; cout << add<x,y>::ret << endl; // Works cout << addFunc(1,2) << endl; // Compiler error return 0;}
我使用GCC 4.8.1,输出是:
‘x’不是类型为’int’的模板参数中的常量表达式
‘y’在类型’int’的模板参数中不是一个常量表达式
我试图计算add :: ret的两种方式之间的区别究竟是什么?这两个值都应该在编译时可用.
解决方法 你告诉编译器,addFunc将是一个constexpr.但是它依赖于参数,这不是constexpr本身,所以编译器已经扼制了.标记它们只是意味着你不会在函数体中修改它们,并且在这一点上不考虑对函数进行的具体调用.有一种方法可以使编译器了解你只会将编译时常数传递给addFunc:使参数成为一个模板参数本身:
template <int x,int y>constexpr int addFunc() { return add<x,y>::ret;}
然后调用
cout << addFunc<1,2>() << endl;总结
以上是内存溢出为你收集整理的c – constexpr函数参数作为模板参数全部内容,希望文章能够帮你解决c – constexpr函数参数作为模板参数所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)