递归变量模板函数的编译错误

时间:2011-02-17 23:12:23

标签: c++ recursion c++11 codeblocks variadic

我在Code :: Blocks中准备了一个简单的可变参数模板测试,但是我收到了一个错误:

  

没有匹配函数来调用'OutputSizes()'

这是我的源代码:

#include <iostream>
#include <typeinfo>

using namespace std;

template <typename FirstDatatype, typename... DatatypeList>
void OutputSizes()
{
    std::cout << typeid(FirstDatatype).name() << ": " << sizeof(FirstDatatype) << std::endl;
    OutputSizes<DatatypeList...>();
}

int main()
{
    OutputSizes<char, int, long int>();
    return 0;
}

我正在使用-std=C++0x的GNU GCC。使用-std=gnu++0x没有任何区别。

2 个答案:

答案 0 :(得分:14)

以下是消除基本情况歧义的方法:

#include <iostream>
#include <typeinfo>

template <typename FirstDatatype>
void OutputSizes()
{
    std::cout << typeid(FirstDatatype).name() << ": " << sizeof(FirstDatatype) << std::endl;
}

template <typename FirstDatatype, typename SecondDatatype, typename... DatatypeList>
void OutputSizes()
{
    OutputSizes<FirstDatatype>()
    OutputSizes<SecondDatatype, DatatypeList...>();
}

int main()
{
    OutputSizes<char, int, long int>();
}

答案 1 :(得分:1)

这是因为你没有提供基本案例。您提取了可变参数模板参数的最后一种数据类型 - 然后您尝试将空的可变参数与采用类型和可变参数的函数进行匹配。当variadic参数为空时,你需要提供一个“基本案例”。

using namespace std;

template <typename FirstDatatype, typename... DatatypeList>
void OutputSizes()
{
    std::cout << typeid(FirstDatatype).name() << ": " << sizeof(FirstDatatype) << std::endl;
    OutputSizes<DatatypeList...>();
}

template<typename... DataTypeList>
void OutputSizes() // We're called when there's no template arguments
                   // left in the pack
{
}

int main()
{
    OutputSizes<char, int, long int>();
    return 0;
}

编辑:我在这里显示的多零重载实际上只有在你根据模板类型获取实际运行时参数时才有效。如果你只是直接获取模板参数,你可以使用两个一个递归,如Howard Hinnant的回答所示。