【发布时间】:2019-08-06 14:14:09
【问题描述】:
我正在通过将 typedef 转换为使用别名来将一些 C++ 代码更新为 C+11。给定以下 SCCE:
#include <iostream>
#include <linux/cn_proc.h>
/**
* Legacy C structure
*/
struct sample {
enum what {
FOO,
BAR
} what;
};
void tdef( ) {
typedef enum sample::what demo;
demo a = sample::FOO;
std::cout << a << std::endl;
}
void usingdemo( ) {
using demo = enum sample::what;
demo a = sample::BAR;
std::cout << a
<< std::endl;
}
int main() {
tdef();
usingdemo();
}
我在使用 using 声明时收到警告:
warning: declaration ‘enum sample::what’ does not declare anything
using demo = enum sample::what;
^
虽然代码编译和执行都很好。编译器是g++ (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609 问题出在编译器上,还是在我身上?
感谢您的回复。关于 C 结构的 cmets:
“S”是 SCCE 很小,所以我发布了最小的结构 证明问题。我使用的实际结构是“struct proc_event” linux/cn_proc.h。
我只是将它包含在没有“extern C”的情况下 它工作正常。
【问题讨论】:
-
如果你删除
enum会有什么变化吗? -
@melpomene - 是的,它会 - 一个不同的错误,而不是警告。
-
@melpomene 是的。它拒绝说
what不是结构的代码。 FWIW clang 和 icc 不会抱怨 OP 代码中的任何内容。 gcc 中的诊断可能不正确。 -
@luk32 VC++ 也没有 /W4
-
您是否尝试过`using demo = typename sample::what;'?毕竟是嵌套类型。