編譯器警告 (層級 4) C4512
'class':無法產生指派運算子
編譯器無法為指定的類別產生指派運算子。 未建立任何指派運算子。
衍生類別所無法存取的基底類別之指派運算子可能會導致此警告。
若要避免這個警告,請為該類別指定使用者定義的指派運算子。
編譯器也會為未定義的類別產生指派運算子函式。 此指派運算子是物件資料成員的成員複本。 由於在初始設定之後無法修改 const
資料項目,因此如果類別含有 const
項目,則預設指派運算子將無法運作。 C4512 警告的另一個原因是宣告參考類型的非靜態資料成員。 如果目的是要建立不可複製的類型,您也必須防止建立預設複製建構函式。
您可以用三種方式之一來解決程式碼的 C4512 警告:
明確地定義類別的指派運算子。
從類別中的數據項中移除
const
或參考運算元。使用 #pragma warning 語句來隱藏警告。
範例
下列範例會產生 C4512。
// C4512.cpp
// compile with: /EHsc /W4
// processor: x86
class Base {
private:
const int a;
public:
Base(int val = 0) : a(val) {}
int get_a() { return a; }
}; // C4512 warning
class Base2 {
private:
const int a;
public:
Base2(int val = 0) : a(val) {}
Base2 & operator=( const Base2 & ) { return *this; }
int get_a() { return a; }
};
// Type designer intends this to be non-copyable because it has a
// reference member
class Base3
{
private:
char& cr;
public:
Base3(char& r) : cr(r) {}
// Uncomment the following line to explicitly disable copying:
// Base3(const Base3&) = delete;
}; // C4512 warning
int main() {
Base first;
Base second;
// OK
Base2 first2;
Base2 second2;
char c = 'x';
Base3 first3(c);
Base3 second3 = first3; // C2280 if no default copy ctor
}