gpt4 book ai didi

c++ - 为什么这个可变参数模板特化定义不能编译?

转载 作者:搜寻专家 更新时间:2023-10-31 01:48:45 26 4
gpt4 key购买 nike

使用 gcc 4.7.3,我得到以下错误

prog.cpp: In function ‘int main()’: prog.cpp:27:63: error: ‘Erase >::Result’ has not been declared

this code :

template <typename... List>
struct TypeList
{
enum
{
Length = sizeof...(List)
};
};

template <typename ToErase, typename... List>
struct Erase;

template <typename ToErase>
struct Erase<ToErase, TypeList<>>
{
typedef TypeList<> Result;
};

template <typename ToErase, typename... Head, typename... Tail>
struct Erase<ToErase, TypeList<Head..., ToErase, Tail...>>
{
typedef TypeList<Head..., Tail...> Result;
};

int main()
{
static_assert(Erase<double, TypeList<int, double, char>>::Result::Length == 2,
"Did not erase double from TypeList<int, double, char>");

return 0;
}

鉴于我收到的错误消息,我不明白为什么代码无法编译,因为类似的情况确实可以干净地编译:

template <typename ToAppend, typename... List>
struct Append;

template <typename ToAppend, typename... List>
struct Append<ToAppend, TypeList<List...>>
{
typedef TypeList<List..., ToAppend> Result;
}

template <typename... ToAppend, typename... List>
struct Append<TypeList<ToAppend...>, TypeList<List...>>
{
typedef TypeList<List..., ToAppend...> Result;
}

标准中是否有关于无法像我尝试处理第一个代码块那样推断出两个参数包中间的元素的引述?

最佳答案

§ 14.8.2.5(从类型推导模板参数)第 5 段列出了无法推导模板参数的上下文。相关的是列表中的最后一个:

— A function parameter pack that does not occur at the end of the parameter-declaration-clause.

所以在:

struct Erase<ToErase, TypeList<Head..., ToErase, Tail...>>

Head 无法推导;它不会出现在参数列表的末尾。

相比之下,在:

struct Append<TypeList<ToAppend...>, TypeList<List...>>

ToAppendList 都出现在各自参数列表的末尾,因此可以推导出它们。

关于c++ - 为什么这个可变参数模板特化定义不能编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17332286/

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