Поделиться через


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

Приведение между разными представлениями указателя на члены компилятор может создать неправильный код

Обнаружен неправильный приведение между типами указателя на члены.

Замечания

C4407 можно создать из-за работы соответствия компилятора, выполненной в Visual Studio 2005. Теперь для указателя на член требуется полное имя и оператор адреса (>).

C4407 может произойти, если между несколькими указателем наследование на член может быть один указатель на наследование. Иногда это может работать, но иногда это не может, так как представление одного указателя наследование на член не имеет достаточной информации. Компиляция с помощью справки /vmm . Дополнительные сведения см. в разделе /vmm, /vmv/vms(представление общего назначения). Вы также можете попробовать переупорядочение базовых классов; Компилятор обнаруживает потерю информации в преобразовании, так как базовый класс находится в ненулевых смещениях от производного.

Пример

В следующем примере создается C4407 и показано, как исправить его:

// C4407.cpp
// compile with: /W1 /c
struct C1 {};
struct C2 {};
struct C3 : C1, C2 {};

typedef void(C3::*PMF_C3)();
typedef void(C2::*PMF_C2)();

PMF_C2 f1(PMF_C3 pmf) {
   return (PMF_C2)pmf;   // C4407, change type of cast,
   // or reverse base class inheritance of C3 (i.e. : C2, C1)
}