문제

How can I get the below code to compile on g++ 4.7? It will compile if I place the body of foo inline, but I don't want it inline (because the real code is a lot more complicated).

struct A
{
  void foo();
} __attribute__((__may_alias__));

void A::foo() {}

int main() {return 0;}

Error:

/tmp/test.cpp:6:6: error: prototype for ‘void A::foo()’ does not match any in class ‘A’
/tmp/test.cpp:3:8: error: candidate is: void A::foo()
도움이 되었습니까?

해결책

Place the attribute directly after the struct keyword:

struct __attribute__((__may_alias__)) A
{
  void foo();
};

void A::foo() {}

int main() {return 0;}

This works for my g++4.7, while putting it after the closing } yields the same error as you got.

From the gcc documentation:

An attribute specifier list may appear as part of a struct, union or enum specifier. It may go either immediately after the struct, union or enum keyword, or after the closing brace. The former syntax is preferred.

(The rest of the paragraph might reveal what's the underlying problem, and why it works when putting the attribute before the member-specification.)

Found this question by chance as you received the [tumbleweed] badge for it ;)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top