我正在尝试创建这样的东西:
$ dockerd --help
# ...
--ip=0.0.0.0 Default IP when binding container ports
我是从编译器得到的:
在功能' int main()':
19:16:错误:调用非constexpr函数' int FP :: addS(FP)[int K = 2; int L = 1]'
19:16:错误:调用非constexpr函数' int FP :: addS(FP)[int K = 2; int L = 1]'
19:17:注意:在类型' int'的模板参数中
19:22:错误:声明中的无效类型' ='令牌
19:33:错误:无法转换' FP< 3>'到' int'在初始化
19:19:警告:未使用的变量' n3' [-Wunused可变] 在< FP<(L + K)>的实例化中。 FP :: add(FP)[int K = 2; int L = 1]':
19:33:从这里要求
9:5:警告:函数返回non-void时没有return语句[-Wreturn-type]
我该如何解决这个问题?
通常,我想将结果保存到正确的变量,但不想计算正确的模板值。
答案 0 :(得分:2)
问题在于:
FP<n1.addS(n2)>
因为addS的结果不是常量表达式。您必须将其标记为一个
template<int K> constexpr int addS(FP<K> a)
现在constexpr函数只有在它们的参数也是常量表达式时才会产生常量表达式,所以n1和n2也应该标记为constexpr。
constexpr FP<1> n1;
constexpr FP<2> n2;
答案 1 :(得分:1)
更简单的方法是使用auto
auto n3 = n1.add(n2);
否则你必须丢失constexpr
template<int L>
class FP {
public:
int n;
template<int K>
FP<L+K> add(FP<K> a) const {
FP<L+K> r;
r.n = n+a.n;
return r;
}
template<int K> constexpr static int addS(FP<K> a) {
return L+K;
}
};
int main()
{
constexpr FP<1> n1;
constexpr FP<2> n2;
FP<n1.addS(n2)> n3 = n1.add(n2);
}
答案 2 :(得分:0)
您可以使用auto
:
auto n3 = n1.add(n2);
或略微更改addS
的声明:
template<int K>
static constexpr int addS(FP<K> &) {
return L+K;
}
如@ Jarod42所述
否则,您还可以使用decltype
:
decltype(n1.add(n2)) n3 = n1.add(n2);
或constexpr
支持功能:
template<int I, int J>
constexpr int f(FP<I> &, FP<J> &) {
return I+J;
}
// ...
FP<f(n1, n2)> n3 = n1.add(n2);
如果您不想更改addS
的定义。