我正在使用C ++ 11并包含一个用C ++ 03实现的h文件。在h文件中,我包含了枚举Foo
。我想在code.h
中声明转发,并在code.cpp
中使用它:
header.h:
enum Foo {A=1};
code.h:
enum Foo : int; // also tried : unsigned int, long, short, unsigned short, char, unsigned char
void bar(Foo foo);
code.cpp:
#include header.h
void bar(Foo foo) { }
这是我编译时遇到的错误(测试g ++ 4.8.5和g ++ 5.3.1):
In file included from code.cpp:2:0:
header.h:1:6: error: underlying type mismatch in enum ‘enum Foo’
enum Foo {A=1};
^
In file included from code.cpp:1:0:
code.h:3:12: error: previous definition here
enum Foo : int;
如果我将header.h更改为:
,我可以修复此错误enum Foo : int {A=1};
但我不拥有那个标题,也无法改变它。以面值表示错误,听起来我需要知道的是g ++使用哪种类型的枚举而不指定基础类型,然后在我的转发中使用该类型。
Even this simple example doesn't work:
#include <iostream>
#include <string>
#include <type_traits>
enum Foo {A=1};
enum Foo : unsigned; // : std::underlying_type<Foo>::type also doesn't work
int main()
{
std::cout << "Hello, world\n";
}
答案 0 :(得分:7)
似乎没有任何方法可以做到这一点,即使你指定了编译器为你的C ++ 03风格{{1}选择的完全相同的底层类型 }。
示例:编译以下代码......
enum
... on Coliru and demangling via c++filt
将使用 g ++ 和 clang ++ 打印enum Foo { A=1 };
cout << typeid(std::underlying_type_t<Foo>::type).name();
。
即使您将"unsigned int"
指定为unsigned int
转发声明的显式基础类型,both compilers will complain。
Foo
enum Foo : unsigned int;
void bar(Foo);
enum Foo {A=1};
这是因为前向声明和“真实”main.cpp:8:6: error: enumeration previously declared with fixed underlying type
enum Foo {A=1};
^
main.cpp:5:6: note: previous declaration is here
enum Foo : unsigned int;
^
声明都需要具有相同的显式基础类型,即使您设法“猜测“编译器会为你选择什么。”
tl; dr :如果前向声明和真实声明都具有相同的明确指定的基础类型,则只能转发声明enum
答案 1 :(得分:4)
如果你在前向声明中给它一个固定的底层类型,你只能转发声明一个枚举。此外,枚举的定义必须使用相同的固定底层类型。
您的问题是header.h
中的枚举定义没有基础类型,但后面的前向声明有一个。他们两者必须有一个。
答案 2 :(得分:0)
从我今天的gcc版本开始,您必须两次定义确切的类型,不仅在向前的声明中,而且在定义中:
enum Foo : int;
...
enum Foo : int {A=1};
这对我有用,编译器是gcc 7.3.0。