天天看點

關于VC編譯器錯誤 Error C2558

我今天往一個類A裡面塞了一個另外一個類B作為成員變量,然後就報錯了。

類A的僞代碼如下:

關于VC編譯器錯誤 Error C2558

class A

關于VC編譯器錯誤 Error C2558

{

關于VC編譯器錯誤 Error C2558

public:

關于VC編譯器錯誤 Error C2558

    A(){}

關于VC編譯器錯誤 Error C2558

    virtual ~A(){;}

關于VC編譯器錯誤 Error C2558
關于VC編譯器錯誤 Error C2558

private:

關于VC編譯器錯誤 Error C2558

    B b;

關于VC編譯器錯誤 Error C2558

};

類B的僞代碼如下:

關于VC編譯器錯誤 Error C2558

class B

關于VC編譯器錯誤 Error C2558
關于VC編譯器錯誤 Error C2558
關于VC編譯器錯誤 Error C2558

 B(){}

關于VC編譯器錯誤 Error C2558

 virtual ~B(){;}

關于VC編譯器錯誤 Error C2558
關于VC編譯器錯誤 Error C2558
關于VC編譯器錯誤 Error C2558

 B(const B& b);

關于VC編譯器錯誤 Error C2558

 B& operator = (const B& b);

關于VC編譯器錯誤 Error C2558

發現了什麼特别的沒有?

嗯,是的,B裡面做了防拷貝

錯誤是由于這樣一段代碼引發的:

關于VC編譯器錯誤 Error C2558

typedef std::vector<A> AArray;

關于VC編譯器錯誤 Error C2558

AArray arr;

關于VC編譯器錯誤 Error C2558

A a;

關于VC編譯器錯誤 Error C2558

arr.push_back(a);

我用的是VS2003,報錯卻報錯到vector這裡,很讓人摸不着頭腦。其實不是vector有問題,隻是說,push_back這個操作會做一個對象拷貝,而B是不允許拷貝的,是以觸發了錯誤。

我剛才試了下vs2010,錯誤就非常精确到位了。

關于VC編譯器錯誤 Error C2558

錯誤 1 error C2248: “B::B”: 無法通路 private 成員(在“B”類中聲明) e:\project\testc2558\testc2558\testc2558.cpp 25

關于VC編譯器錯誤 Error C2558

不知道vs2003之後vs2010之前的版本情況如何。反正,vs2010我是知道的,2010對模闆的錯誤下了一番功夫的。由此可見,效果還是非常明顯的。

繼續閱讀