1

コードといくつかのエラーと警告がありますが、なぜそれらが発生するのか理解できませんでした。アドバイスをいただけませんか?

最初:

#pragma once

#include "Vector3.h"
#include <vector>

#include <GL/glew.h>

class BoundingSphere
{
public:
    float radius;
    Vector3 center;
    BoundingSphere(float radius, Vector3 center) : radius(radius),center(center) {};
    BoundingSphere() {};
};

class TriangleFace;

class MeshVertex
{

private:
    Vector3 position; 
    std::vector<TriangleFace *> faces;
    Vector3 normal;
    bool normalUpdateNeeded;

public:

    unsigned int index;

    MeshVertex(void);
    MeshVertex(Vector3 position);
    ~MeshVertex(void);

    Vector3 &getPos() {return position;};
    void addFace(TriangleFace *face);
    const std::vector<TriangleFace*>& getFaces() {return faces;  };
    Vector3 getNormal();

    void setPos(Vector3 & pos) {position = pos; }
    bool isSurfaceParticle() {return faces.size()>0;}
    void updateNormal();
};

class TriangleFace
{
private:
    Vector3 normal;
    bool normalUpdateNeeded;

public:
    MeshVertex* particles[3];
    TriangleFace(void);
    TriangleFace(MeshVertex *p1, MeshVertex *p2, MeshVertex *p3);
    MeshVertex& operator[](int i) {  return *(particles[i]); }
    Vector3 getNormal();
    ~TriangleFace(void);
    void updateNormal();
};

class TriangleMesh
{
protected:
    std::vector<MeshVertex> particles;
    std::vector<TriangleFace> faces;

public:
    TriangleMesh(string filename);
    ~TriangleMesh(void);

    void reserveNumberOfFaces(unsigned int n) { faces.reserve(n); };
    void addFace(TriangleFace &f) {faces.push_back(f);};
    void addFace(MeshVertex *p1, MeshVertex *p2, MeshVertex *p3) {faces.push_back(TriangleFace(p1,p2,p3));};

    std::vector<TriangleFace>& getFaces() {return faces;};
    std::vector<MeshVertex>& getParticles() { return particles; };

    void updateNormals();

    BoundingSphere getBoundingSphere();
};


class RenderTriangleMesh
{
private: 
    TriangleMesh &m;

    GLuint vboid[2];

    GLfloat *vertices;
    GLfloat *normals;

public:
    RenderTriangleMesh(TriangleMesh &m);
    void draw();

private:
    void generateVBOs();
    void updateVBOs();

};

エラー:

エラー C2220: 警告がエラーとして処理されました - 'オブジェクト' ファイルが生成されていません

警告 C4512: 'RenderTriangleMesh': 代入演算子を生成できませんでした

そして他の:

 virtual short SimpleAddOK(const GeneralMatrix* gm) { return 0; }

エラー :

エラー C2220: 警告がエラーとして処理されました - 'オブジェクト' ファイルが生成されていません

警告 C4100: 'gm': 参照されていない仮パラメーター

4

1 に答える 1

7

1 つ目は、コンパイラが代入演算子を生成できなかったことを示しています。これは、参照を再配置できないため、参照メンバーが原因で発生します。

struct foo
{
    int& i;
};

int x, y;
foo f = { x };
foo g = { y };

f = g; // ??? 

自分で明示的に無効にすることで、警告を黙らせることができます。

struct foo
{
    int& i;

private:
    foo& operator=(const foo&); // declared but never defined
};

これは、代入演算子を使用不可にする古いトリックですが、コンパイラがそれを生成するのを止めます。

C++11 では、これを行うことができます。

struct foo
{
    int& i;

private:
    foo& operator=(const foo&) = delete;
};

これはより明示的で、ハックが少ないです。


もう 1 つは、引数を使用したことがないためです。これは、多くの場合、プログラム ロジックのエラーになる可能性があります。使用しない場合は、おそらくその名前を削除する必要があります。

virtual short SimpleAddOK(const GeneralMatrix* /* gm */) { return 0; } 

個人的には完全に削除します。他の人はこれを行います:

virtual short SimpleAddOK(const GeneralMatrix* gm)
{
    (void)gm; // this "uses" gm

    return 0;
} 

と呼ばれるマクロにラップされることがありUSEます。

#define USE(x) (void)x

virtual short SimpleAddOK(const GeneralMatrix* gm)
{
    USE(gm);

    return 0;
} 

警告が実際に正しい場合 (つまり、プログラムに欠陥があり、それが表示されていない場合) は、警告を隠し、目的を無効にするため、これらは単に名前を削除するよりも劣っていると考えてます。

警告は、黙らせるのではなく、常に修正する必要があります。

于 2012-08-21T02:32:14.667 に答える