gpt4 book ai didi

c++ - 简单的可变参数模板函数无法实例化

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:11:35 24 4
gpt4 key购买 nike

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

此错误位于 *HERE*

No matching function call to ...
... candidate is template<class H, class ... T> size_t num_args()

即它没有看到首先定义的基本情况。前向声明template<typename...T>num_args();在重载决策中引入歧义。

x.cpp:30:45: note: candidates are:
x.cpp:7:36: note: size_t num_args() [with Args = {int, float, char}, size_t = long unsigned int]
x.cpp:16:9: note: size_t num_args() [with H = int, T = {float, char}, size_t = long unsigned int]

我正在使用 gcc 4.6。我怎样才能使它工作?

谢谢。

最佳答案

您没有声明基本情况。您的 num_args 有一个无模板重载函数,但在调用函数时num_args<T...>()这将永远找不到,原因很明显:它总是会尝试实例化一个函数模板

不过,您可以专门化您的函数模板以执行所需的操作。

template <>
constexpr size_t num_args<>()
{
return 0;
}

但是,这也行不通,因为在这里您特化了一个无参数函数模板,而这样的模板不存在:您的另一个函数模板 num_args总是有至少一个参数,H .

为了真正完成这项工作,您需要部分特化,而这些仅适用于类模板。这就是您在这里需要的。

template <typename T>
struct num_args_t;

template <>
struct num_args_t {
static size_t const value = 0;
};

template <typename H, typename T...>
struct num_args_t {
static size_t const value = num_args_t<T...>::value + 1;
};

template <typename T...>
constexpr size_t num_args() {
return num_args_t<T...>::value;
}

关于c++ - 简单的可变参数模板函数无法实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7108161/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com