0

私はこのような構造体を持っています:

/* 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) 定義していないので、生成されるのでしょうか?

ありがとう

4

2 に答える 2

5

定数クラス メンバー オブジェクトがあるため、それらを割り当てることはできません。ただし、コピー コンストラクターを生成する必要があります。

于 2013-04-15T20:50:51.960 に答える
0

この質問への回答を参照してください。これは、暗黙のデフォルト コンストラクターの条件を示しています (強調は私のものです)。

コンストラクターを定義しない場合、コンパイラーはデフォルトのコンストラクターを定義します。

コンストラクターを定義したため、暗黙的なデフォルトのコンストラクターはもう使用できません。定義するのはあなた次第です。

実際、同じ答えの下の数行は、クラスのすべての必須メソッドに対して同じ規則を示しています。

デストラクタ/コピーコンストラクタ/代入演算子が定義されていない場合、コンパイラはそれらのいずれかを構築します

于 2013-04-15T21:11:07.757 に答える