C ++ 11 Enum forward导致“底层类型不匹配”

时间:2017-03-13 15:01:32

标签: c++ c++11 gcc g++ forward-declaration

我正在使用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";
}

3 个答案:

答案 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。