我有一个可变的模板函数,它调用自己来确定列表中最大的数字(由模板参数组成).当我的参数包为空时,我试图做一个专门化的工作,所以我可以在列表的前面返回数字,但是我不知道该怎么做.我只是熟悉可变模板和模板专业化,但这是我到目前为止:
#include <string> #include <iostream> using namespace std; template <int N,int... N2> int tmax() { return N > tmax<N2...>() ? N : tmax<N2...>(); } template <int N> int tmax() { return N; } int main() { cout << tmax<32,43,54,12,23,34>(); }
但是,这会产生以下错误:
test.cpp: In function ‘int tmax() [with int N = 34,int ...N2 = {}]’: test.cpp:9:45: instantiated from ‘int tmax() [with int N = 23,int ...N2 = {34}]’ test.cpp:9:45: instantiated from ‘int tmax() [with int N = 12,int ...N2 = {23,34}]’ test.cpp:9:45: instantiated from ‘int tmax() [with int N = 54,int ...N2 = {12,34}]’ test.cpp:9:45: instantiated from ‘int tmax() [with int N = 43,int ...N2 = {54,34}]’ test.cpp:9:45: instantiated from ‘int tmax() [with int N = 32,int ...N2 = {43,34}]’ test.cpp:18:39: instantiated from here test.cpp:9:45: error: no matching function for call to ‘tmax()’ test.cpp:9:45: error: no matching function for call to ‘tmax()’
我也试过这个,只是为了看看它是否可以工作(尽管它随机地将数字0引入到列表中,以至于它不能返回小于0的数字):
template <int N,int... N2> int tmax() { return N > tmax<N2...>() ? N : tmax<N2...>(); } template <> int tmax<>() { return 0; }
error: template-id ‘tmax<>’ for ‘int tmax()’ does not match any template declaration
那我该怎么办才能得到这个工作?
我使用g 4.5.2和-std = c 0x标志.
@H_502_20@解决方法
我看到使用
clang的两个错误.
>把重载放在一个单一的int上.
>为长度为1的列表做明确的事情.回想一下,可变列表可以具有零大小,而在什么时候,在我看来你有歧义.
这为我编译并正确运行:
#include <iostream> using namespace std; template <int N> int tmax() { return N; } template <int N,int N1,int... N2> int tmax() { return N > tmax<N1,N2...>() ? N : tmax<N1,N2...>(); } int main() { cout << tmax<32,34>(); }
54
@H_502_20@ @H_502_20@ 原文链接:https://www.f2er.com/c/114087.html