игнорировать ошибку компиляции g ++ для дополнительной квалификации для обратной совместимости - PullRequest
2 голосов
/ 07 марта 2012

Я пытаюсь перенести проект в новую систему Linux с более новой версией g ++.При компиляции я получаю следующее:

ошибка: дополнительная квалификация 'Customer ::' на члене 'getCustomer'

Внутри определения класса я ставлю префикс getCustomer () с Customer ::.

Если я удаляю Customer :: , мой код работает, однако в коде много записей с префиксом имен классов и оператора области действия,Есть ли способ, например, директива компилятора, который помогает устранить эту ошибку?

Из моей оболочки gcc версия 4.4.2 20091027 (Red Hat 4.4.2-7) (GCC)

Ответы [ 2 ]

1 голос
/ 22 июля 2015

Такой код может быть скомпилирован с -fpermissive. (GCC 4.9.2, не clang 3.6.0)

Я протестировал полную программу на основе интерпретации Ларсманса:

#include <cstdio>
class Customer {
    public: Customer *Customer::getCustomer() { return this; }
};
int main()
{
    std:printf("%p\n", Customer().getCustomer());
}

Не компилируется с g++ test.cpp, но компилируется (с предупреждением) с g++ test.cpp -fpermissive.Даже g++ test.cpp -fpermissive -ansi и g++ test.cpp -fpermissive -std=c++11 работают.

С -w вы не получите предупреждение, но, возможно, это не всегда лучшая идея: вы можете получить информацию, когда что-то странное.

clang++ test.cpp -fpermissive выдает ошибку, хотя clang, похоже, распознает параметр -fpermissive.Может быть, кто-нибудь знает способ заставить его принять такой код.

1 голос
/ 07 марта 2012

Внутри определения класса я ставлю префикс getCustomer () перед Customer ::.

Я предполагаю, что вы имеете в виду:

class Customer {
    Customer *Customer::getCustomer() { ... }
};

Не,В этом нет необходимости, поскольку вы уже находитесь в определении класса, и я не думаю, что стандарт C ++ даже допускает это (я удивлен, что старый G ++ сделал?).

Кажется, что нет флага -std(в GCC 4.4.5), который разрешает это.

...