相关疑难解决方法(0)

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

我在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没有区别.

c++ recursion codeblocks variadic c++11

8
推荐指数
1
解决办法
2723
查看次数

简单的可变参数模板功能无法立即实现

我知道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)

c++ variadic-templates constexpr c++11

4
推荐指数
1
解决办法
563
查看次数

为什么这个可变函数模糊不清?

这与我之前的帖子有关.我想知道为什么一个尝试的解决方案不起作用.

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与T = {int,float}
  • B,H = int,T = {float}

我不明白这是多么模糊 - A是声明而B是A声明的函数的定义.对吗?

我试图让这个例子起作用,对我之前的问题的回答似乎声称它永远不会起作用.

如果是这样的话,可变自由函数有什么意义呢?有什么怎么办呢?

c++ variadic-templates c++11

3
推荐指数
1
解决办法
1892
查看次数