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 回答