gpt4 book ai didi

c++ - 在 C++ 中使用枚举作为模板类型参数

转载 作者:IT老高 更新时间:2023-10-28 22:21:41 29 4
gpt4 key购买 nike

在 C++ 中使用枚举作为模板(类型)参数是否有任何限制/问题?

例子:

enum MyEnum
{
A, B, C, D, E
};

template <typename _t>
class MyTemplate
{
public:
_t value;

void func(const _t& param) { /* .... */ }
};

// ....

MyTemplate<MyEnum> MyInstance;

我在 Win32/x86 上通过 VS 2008 (SP1) 使用 MSVC++ 的实际问题是与使用枚举作为模板参数的类相关的几个编译错误(= 编译器报告的错误)。由于我的项目不幸变得有点复杂(您可以将其视为设计错误:P),引发这些错误的模板类是派生的、嵌套的,甚至专门用于具有枚举模板参数的类。

编译器在尝试构建时会在只有注释的行中报告许多错误/无用的错误,例如“C2059: syntax error: 'public'”。其中许多我可以通过用 _t 替换类似于示例中的 const _t& 参数的方法来修复(即复制参数),但我既不能修复所有这些错误,也不知道为什么这个“有帮助” . **我知道,上面的简单示例编译时没有错误。

使用 int 而不是 enum,我的项目编译时没有错误。

提前感谢任何提示或提示!


编辑:

毕竟,我认真地认为这是一个编译器错误。当我试图用简化的代码重现错误时,我只在所有“构建”的 50% 中得到了它们,不是很确定:
例如。试图编译,它报告了这些错误。重建 - 没有变化。删除了评论,构建 - 没有变化。重建 - 然后:没有错误,编译正常。

我已经遇到了一些编译器错误(我猜在 20k 行代码内有 2 或 3 个),但这个在我看来很奇怪。
任何建议如何确定它是否编译器?

最佳答案

是的,有限制。例如,根据 C++03 14.3.1[temp.arg.type]/2

,您不能使用匿名枚举作为模板参数

A local type, a type with no linkage, an unnamed type or a type compounded from any of these types shall not be used as a template-argument for a template type-parameter.

所以下面的代码在 C++03 中是无效的:

template <typename T>
void f(T) {}

enum {A};

int main() {
f(A);
}

但它在 C++11 中有效。

关于c++ - 在 C++ 中使用枚举作为模板类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3485472/

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