2013-04-15 61 views
0

我有這樣的結構:爲什麼在這種情況下operator =和copy-constructor不是隱式生成的?

/* Renderable definition */ 
    struct Renderable 
    { 
     Renderable(VertexBufferPtr vertexBuffer, const Mat4& wvpMatrix, const Mat4& worldMatrix, const Vec4& diffuseColor, const float specularFactor) : 
        mVertexBuffer(vertexBuffer), mTransform(wvpMatrix, worldMatrix), mMaterial(diffuseColor, specularFactor) 
     { 
     } 

     /* Transform definition */ 
     struct Transform 
     { 
      Transform(const Mat4& wvpMatrix, const Mat4& worldMatrix) : mWVPMatrix(wvpMatrix), mWorldMatrix(worldMatrix) 
      { 
      } 

      const Mat4 mWVPMatrix; 
      const Mat4 mWorldMatrix; 
     }; 

     /* Material definition */ 
     struct Material 
     { 
      Material(const Vec4& diffuseColor, const float specularFactor) : mDiffuseColor(diffuseColor), mSpecularFactor(specularFactor) 
      { 
      } 

      const Vec4 mDiffuseColor; 
      const float mSpecularFactor; 
     }; 


     const VertexBufferPtr mVertexBuffer; 
     const Transform mTransform; 
     const Material mMaterial; 
    }; 

    /* RenderQueue definition */ 
    typedef std::vector<Renderable> RenderQueue; 

當我嘗試在我的代碼這樣使用它;

RenderQueue CreateRenderQueue(const Scene* scene); 

.... 

RenderQueue renderQueue(CreateRenderQueue(activeScene)); 

我得到後續編譯錯誤:

c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility(2514): error C2582: 'operator =' function is unavailable in 'Renderable' 

一些挖我才意識到那是因爲我還沒有定義的賦值操作符和拷貝構造函數後。然後我這樣做了,瞧!它編譯...

....我的問題是,然而,爲什麼賦值操作符和拷貝構造函數不會隱式由編譯器產生的? (vs2010)我沒有定義它們,所以它們肯定會生成?

謝謝

+0

什麼是'VertexBufferPtr'?它是可複製的嗎? –

回答

5

你有不斷的類成員對象,所以你不能指定這些對象。不過,應該生成一個拷貝構造函數。

(這裏有一個little example。)

+0

謝謝,我現在明白了 – KaiserJohaan

+0

你剛剛救了我的一天,從未想過這件事。 – Mikhail

0

the answer to this question,其中規定了一個隱含的默認構造函數的條件(重點煤礦):

If you do not define a constructor, the compiler will define a default constructor for you

你定義的構造函數,因此隱含的默認一個不現在可以使用了,您可以自己定義一個。

事實上,同樣的答案下面的幾行給出了所有的類的基本方法相同的規則:

If no destructor/copy Constructor/Assignment operator is defined the compiler builds one of those for you

相關問題