Предупреждение компилятора (уровень 4) C4256

"function" : конструктор для класса с виртуальными базами имеет "..."; вызовы могут быть несовместимы со старыми версиями Visual C++

Возможная несовместимость.

Рассмотрим следующий пример кода. Если определение конструктора S2::S2(int i, ...) было скомпилировано с помощью версии компилятора Microsoft C++ до версии 7, но следующий пример компилируется с помощью текущей версии, вызов конструктора для S3 не будет работать правильно из-за изменения соглашения о вызовах специального регистра. Если оба были скомпилированы с помощью Visual C++ 6.0, вызов не будет работать совершенно правильно, если только параметры не были переданы для многоточия.

Чтобы устранить это предупреждение,

  1. Не используйте многоточие в конструкторе.

  2. Убедитесь, что все компоненты в своем проекте созданы с текущей версией (включая все библиотеки, которые могут определять или ссылаются на этот класс), а затем отключите предупреждение с помощью предупреждения pragma.

Следующий пример приводит к возникновению ошибки C4256:

// C4256.cpp
// compile with: /W4
// #pragma warning(disable : 4256)
struct S1
{
};

struct S2: virtual public S1
{
   S2( int i, ... )    // C4256
   {
      i = 0;
   }
   /*
   // try the following line instead
   S2( int i)
   {
      i = 0;
   }
   */
};

void func1()
{
   S2 S3( 2, 1, 2 );   // C4256
   // try the following line instead
   // S2 S3( 2 );
}

int main()
{
}