c ++ виртуальная функция с аргументами, получая предупреждения, когда не используется

virtual void myFunc(int& a, int& b) {}

Я получаю предупреждения о неиспользуемых переменных, но я не хочу ничего делать с ними в базовом классе.
Я хочу, чтобы производные классы реализовывали их, если они хотят, и ничего не делали, если они их не реализовывали. Что я могу сделать, чтобы остановить предупреждения, кроме установки флага на компилятор?

6

Решение

Просто не дайте им имя:

virtual void myFunc( int&, int& );
22

Другие решения

Поскольку вы не хотите их использовать, вы можете выдавать имена параметров.

Однако вместо того, чтобы удалять их полностью, иногда бывает полезно закомментировать их так:

virtual void myFunc(int& /* a */ , int& /* b */ )
{
}

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

9

У вас есть несколько способов замолчать это предупреждение

  • Удалить их из объявления / определения:

    virtual void myFunc(int& /* a */ , int& /* b */ ) {}
    

    Это решение может вызвать некоторые предупреждения с помощью некоторого инструмента, как Doxygen …

  • Используйте трюк, чтобы сказать, что аргумент не используется:

    template <typename T> void unusedArg(const T&) {} // Helper function.
    
    // In the class
    virtual void myFunc(int& a, int& b) { unusedArg(a); unusedArg(b); }
    

    или в C ++ 11:

    template <typename ... Ts> void unusedArgs(const Ts...&) {} // Helper function.
    
    // In the class
    virtual void myFunc(int& a, int& b) { unusedArgs(a, b); } // C++11
    
  • В C ++ 17 вы также можете использовать атрибут [[maybe_unused]]:

    // In the class
    virtual void myFunc([[maybe_unused]] int& a, [maybe_unused]] int& b) {}
    
6

Попробуйте определить функцию без имен параметров как

virtual void myFunc(int& ,int&  )
{

}

Также рассмотрите возможность сделать базовый класс абстрактным.

virtual void myFunc(int& a,int& b ) = 0;

если это просто приукрашивает интерфейс.

4

В некоторых компиляторах вы можете просто написать имя переменной как оператор «no-op».

virtual void myFunc(int& a, int& b)
{
a;    // unused variable
b;
}

Однако, чтобы поддержать другие компиляторы и прояснить намерение, вы можете использовать макрос или функцию unused_argument чтобы было понятно. 

Если это не работает с вашим компилятором, я думаю, что делать sizeof(a); будет работать.

0
По вопросам рекламы [email protected]