Как заставить VS2015 правильно отклонить использование префикса класса в объявлении класса?

Я недавно скопировал и вставил функцию-член C++ из моего cpp-файла в заголовок и забыл удалить префикс. Итак, в файле cpp у меня было что-то вроде:

int MyClass::Return42() const { return 42; }

и в моем заголовке:

class MyClass {
public:
    int MyClass::Return42() const;
};

Теперь я уверен, что я сделал это раньше и заставил компилятор горько жаловаться на то, что это не разрешено, требуя удаления префикса класса в заголовке. по факту g++ 5.4.0 жалуется на это под Linux независимо от того, на какой стандарт ISO я нацеливаюсь (с 11 по 17), используя один файл (хотя -fpermissive превратит это в предупреждение, а не в ошибку):

#include <iostream>

class MyClass {
public:
    int MyClass::Return42() const;
};

int MyClass::Return42() const { return 42; }

int main() {
    MyClass x;
    std::cout << x.Return42() << '\n';
}

Но я обнаружил, что моя новая установка VsPro15 позволяет это сделать.

Как заставить Visual Studio отклонить этот неверный код, если бы я хотел, чтобы мой код был переносимым на разные платформы?


Я знаю о предлагаемых решениях, связанных с /permissive- а также /Ze,

Во-первых, даже с VS2k15 Update 3, введя /permissive- в Project properties | C/C++ | Command Line | Aditional Options поле, приводит к:

2> cl: предупреждение командной строки D9002: игнорирование неизвестной опции '/permissive-'

Во-вторых, я вижу:

2> cl: предупреждение командной строки D9035: опция 'Ze' устарела и будет удалена в следующем выпуске

но он все равно компилирует ошибочный код.

Так что я не верю, что это жизнеспособное решение.

3 ответа

Решение

Насколько я знаю, вы не сможете не заставить VS2015 предупредить об этом. В этом документе говорится, что вам нужно /permissive- Переключитесь, чтобы получить это конкретное предупреждение. В нем также говорится, что он должен быть включен в VS2015. Может быть, это ошибка компилятора?

В VS2017, однако, вы можете использовать /permissive- переключение, чтобы компилятор более соответствовал стандарту (это также намек, что он не соответствует стандарту, но я не могу найти правильное место в стандарте - может быть, кто-то может его заполнить), см. здесь. С этим вы получаете следующее предупреждение:

error C4596: 'Return42': illegal qualified name in member declaration

Предупреждение, которое вы хотите, также может быть вызвано с помощью /we4596 включить только это предупреждение вместо того, чтобы исходить от более стандартного компилятора соответствия.

Когда я правильно понимаю документацию, в VS2015 вы можете использовать /Ze переключатель (в отличие от /permissive-), однако, когда я использовал компилятор-проводник правильно, это все равно не предупреждает, см. здесь. /Ze Переключатель также обсуждается в этом вопросе SO.

РЕДАКТИРОВАТЬ:

Я нашел это там, где говорится, что предупреждение C4596 введено в версии компилятора 19.00.24215.1. Проводник компилятора в настоящее время содержит более старый компилятор (например, 19.00.24210), поэтому это может быть причиной его неработоспособности.

Ищите C4596 в следующей статье:

https://blogs.msdn.microsoft.com/vcblog/2016/11/16/permissive-switch/

//Use of qualified names in member declarations


struct A {
    void A::f() { } // error C4596: illegal qualified name in member declaration
                    // remove redundant 'A::' to fix
};

Документация уровня предупреждения

/ we nnnn: обрабатывает предупреждение компилятора, указанное в nnnn, как ошибку.

Так что согласно комментарию @ пи выше, для предупреждения C4596, добавив параметр /we4596 делает трюк тогда.

<source>(5): error C4596: 'Return42': illegal qualified name in member declaration
Compiler returned: 2

При добавлении /w14596 только выдает предупреждение, если вы предпочитаете.

<source>(5): warning C4596: 'Return42': illegal qualified name in member declaration
Compiler returned: 0

Как комментарии @pi ниже, это только для VS2017++.

Другие вопросы по тегам