9

我在 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;
}

我将 GNU GCC 与-std=C++0x. 使用-std=gnu++0x没有区别。

4

2 回答 2

15

以下是您如何消除基本情况的歧义:

#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>();
}
于 2011-02-17T23:22:15.783 回答
1

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

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 的回答中所示的二合一递归。

于 2011-02-17T23:14:41.200 回答