コンパイラ エラー C3849
型 'type' の式における関数スタイルの呼び出しは、すべての number に使用できる演算子オーバーロードの const または volatile 修飾子を失う可能性があります
指定した const-volatile 型の変数は、同じまたはより大きい const-volatile 修飾で定義されたメンバー関数のみを呼び出す場合があります。
このエラーを解決するには、適切なメンバー関数を指定します。 変換によって修飾が失われる場合、const または volatile 修飾オブジェクトに対して変換を実行することはできません。 修飾子を取得することはできますが、変換時に修飾子を失うことはできません。
次の例では C3849 が生成されます。
// C3849.cpp
void glbFunc3(int i, char c)
{
i;
}
typedef void (* pFunc3)(int, char);
void glbFunc2(int i)
{
i;
}
typedef void (* pFunc2)(int);
void glbFunc1()
{
}
typedef void (* pFunc1)();
struct S4
{
operator ()(int i)
{
i;
}
operator pFunc1() const
{
return &glbFunc1;
}
operator pFunc2() volatile
{
return &glbFunc2;
}
operator pFunc3()
{
return &glbFunc3;
}
// operator pFunc1() const volatile
// {
// return &glbFunc1;
// }
};
int main()
{
// Cannot call any of the 4 overloads of "operator ()(.....)" and
// "operator pFunc()" because none is declared as "const volatile"
const volatile S4 s4; // can only call cv member functions of S4
s4(); // C3849 to resolve, uncomment member function
}