递归可变参数模板函数的编译错误
我已经在 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
没有什么区别。
I've prepared a simple variadic template test in Code::Blocks, but I'm getting an error:
No matching function for call to 'OutputSizes()'
Here's my source code:
#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;
}
I'm using GNU GCC with -std=C++0x
. Using -std=gnu++0x
makes no difference.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
以下是消除基本情况歧义的方法:
Here's how you disambiguate the base case:
这是因为你没有提供基本情况。您提取了可变参数模板参数的最后一个数据类型,然后尝试将空可变参数与采用类型和可变参数的函数相匹配。您需要为可变参数为空时提供“基本情况”。
编辑:我在这里显示的多零重载实际上仅在您也基于模板类型获取实际运行时参数时才起作用。如果您只直接获取模板参数,则可以使用二一递归,如 Howard Hinnant 的答案所示。
It's because you didn't provide a base case. You extracted the last data type of the variadic template parameter- then you tried to match an empty variadic parameter to a function taking a type and a variadic parameter. You need to provide a "base case" for when the variadic parameter is empty.
Edit: The many-zero overloads I have shown here actually only work when you take actual run-time arguments too based on the template types. If you only take template parameters directly, you have use two-one recursion like shown in Howard Hinnant's answer.