方法的声明改变了符号的含义
Posted
技术标签:
【中文标题】方法的声明改变了符号的含义【英文标题】:Declaration of method changes meaning of symbol 【发布时间】:2013-03-20 23:54:36 【问题描述】:对于以下代码:
struct foo ;
struct A
typedef foo foo_type;
void foo();
;
GCC 给出编译器错误:
test.cpp:7:14: error: declaration of 'void A::foo()' [-fpermissive]
void foo();
^
test.cpp:1:8: error: changes meaning of 'foo' from 'struct foo' [-fpermissive]
struct foo ;
^
但是 clang 接受它并且没有编译器错误。谁是对的?
请注意,如果 typedef 被删除,或更改为typedef ::foo foo_type
,gcc 和 clang 都会接受该代码。
【问题讨论】:
真正的问题是:为什么 Clang 总是正确的? 没有typedef的时候就不奇怪了 改用typedef ::foo foo_type;
试试。
@user315052:这也使错误消失了。我的问题仍然存在。
你也可以用typedef struct foo foo_type;
“解决”它。如果您交换 typedef
和函数声明,行为会发生变化。
【参考方案1】:
gcc 是正确的,但 clang 不需要给出诊断(3.3.7):
在类 S 中使用的名称 N 应在其中引用相同的声明 上下文和在 S 的完整范围内重新评估时。否 违反此规则需要进行诊断。
这是因为类作用域的工作方式。 void foo();
的foo
在类A
的整个 范围内可见,因此void foo();
的声明将typedef 中foo
的含义从引用@987654326 @ 到函数的名称foo
。
【讨论】:
以上是关于方法的声明改变了符号的含义的主要内容,如果未能解决你的问题,请参考以下文章