Как я могу получить приведенный ниже код для компиляции на g ++ 4.7? Он скомпилируется, если я поместу тело foo
встроенный, но я не хочу встроенный (потому что реальный код намного сложнее).
struct A
{
void foo();
} __attribute__((__may_alias__));
void A::foo() {}
int main() {return 0;}
Ошибка:
/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()
Поместите атрибут сразу после struct
ключевое слово:
struct __attribute__((__may_alias__)) A
{
void foo();
};
void A::foo() {}
int main() {return 0;}
Это работает для моего g ++ 4.7, при этом ставя его после закрытия }
выдает ту же ошибку, что и вы.
От документация gcc:
Список спецификаторов атрибутов может отображаться как часть
struct
,union
или жеenum
спецификатор. Это может пойти либо сразу послеstruct
,union
или жеenum
ключевое слово или после закрывающей скобки. Первый синтаксис является предпочтительным.
(Остальная часть параграфа может показать, что является основной проблемой и почему она работает, когда атрибут помещается перед спецификацией члена.)
Нашел этот вопрос случайно, так как вы получили за него значок [)
Других решений пока нет …