我在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;
}
Run Code Online (Sandbox Code Playgroud)
我正在使用GNU GCC -std=C++0x
.使用-std=gnu++0x
没有区别.
我知道sizeof...(Args...)
在C++ 0x压缩模板参数列表中产生了类型的数量,但是我想根据其他功能实现它以用于演示目的,但它不会编译.
// This is not a solution -- overload ambiguity.
// template <typename... Args> size_t num_args (); // Line 7
// template <>
constexpr size_t num_args ()
{
return 0;
}
template <typename H, typename... T>
constexpr size_t num_args () // Line 16
{
return 1 + num_args <T...> (); // *HERE*
}
int main ()
{
std :: cout << num_args <int, int, int> ();
}
Run Code Online (Sandbox Code Playgroud)
这个错误*HERE*
与
No matching function call to ...
... …
Run Code Online (Sandbox Code Playgroud) 这与我之前的帖子有关.我想知道为什么一个尝试的解决方案不起作用.
template <typename... T> /* A */
size_t num_args ();
template <>
size_t num_args <> ()
{
return 0;
}
template <typename H, typename... T> /* B */
size_t num_args ()
{
return 1 + num_args <T...> ();
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试调用,比方说,num_args<int,float>()
那么错误是函数调用是不明确的:
我不明白这是多么模糊 - A是声明而B是A声明的函数的定义.对吗?
我试图让这个例子起作用,对我之前的问题的回答似乎声称它永远不会起作用.
如果是这样的话,可变自由函数有什么意义呢?有什么可怎么办呢?