0
struct vect{
    float x,y,z;
    vect(float xx, float yy, float zz){
        x=xx;
        y=yy;
        z=zz;
    }
    vect(){
        x=0;
        y=0;
        z=0;
    }
    void normalize(){
        float len = sqrt(x*x + y*y + z*z);
        x = x/len;
        y = y/len;
        z = z/len;
    }
    vect operator-(const vect &other) const{return vect(x-other.x,y-other.y,z-other.z);}
};

bool tri_plane_x(vect *v1, vect *v2, vect *v3, vect *pos, float s){

    //removed unnessecary code

    if (vv1 != vv2){
        vect dir = v2 - v1; // getting an error on this line
        dir.normalize();
        float d = (pos->x - v1->x)/dir.x;
        hy[c] = d * dir.y + v1->y;
        hz[c] = d * dir.z + v1->z;
        c++;
    }

    //removed unnessecary code
}

なぜこれがコンパイルされないのか誰かが知っていますか?関数をオーバーロードする方法にエラーがありますか、それともvectへの2つのポインターを減算しているためですか?

./exporter/main.cpp:74:19: error: conversion from ‘long int’ to non-scalar type ‘vect’ requested

これがこの行に関連するコンパイラエラーです。(コード内で何度も繰り返される同じエラーであるため、ログ全体を含めませんでした)

「longint」がどこから来ているのかわかりません...ポインタを使用するときにオーバーロードする別の方法はありますか?

4

4 に答える 4

0

エラーは、vect型のインスタンスをオブジェクト化する必要があるVectにポインターの違いを割り当てているためです。ですから、それらは切り離せません。それに加えて、非線形メモリへの2つのポインタの違いは意味がないと思います。

于 2013-01-19T21:08:56.400 に答える
0

v2v1はポインタです。2つのポインタの違いは、2つのアドレス間のオフセットを示す数値です。これは数値です。

operator-ポインタ自体ではなく、ポイントされたオブジェクトで結果が必要な「ポインタを使用してオーバーロード」する必要はありません。

*v2 - *v1ポインタを逆参照し、ポインタが指すオブジェクトにアクセスするように言う必要があります。

于 2013-01-19T21:09:25.430 に答える
0

それ以外の

    vect dir = v2 - v1;

あなたは書くべきです

    vect dir = *v2 - *v1;

これは、v2v1がベクトルへのポインタであり、ポインタに演算子を適用するとアドレス-が減算されるためです(正確には、アドレスを型のサイズで割った値を減算するため、メモリ内のオフセットの数は、 2つの要素。生の配列のインデックス付けについて知っておくとよいでしょう)。

ポインターの前にアスタリスクを付けると、それを逆参照します。これは、ポインター自体ではなく、ポインターの後ろの値を処理していることを意味します。

オブジェクトのコピーを回避したり、関数への参照によってオブジェクトを渡したりする場合は、ポインターの代わりに参照を使用することをお勧めします。これにより、このような状況が回避されるだけでなく、構文が簡素化されます。

bool tri_plane_x(vect &v1, vect &v2, vect &v3, vect &pos, float s) {
    if (vv1 != vv2) {
        vect dir = v2 - v1;
        dir.normalize();
        // ...
    }
}
于 2013-01-19T21:09:33.057 に答える
0

あなたのoperator -宣言はvect参照を期待していますが、vectポインターを渡しました。参照とポインタは同様の動作を生成できますが、同じものではありません。

それらの違いの詳細については、この投稿を参照してください。

基本的にoperator -、vect自体ではなく、vectへのポインタのペアでを呼び出そうとしています。これを解決するには、差分演算子(*)を使用して、ポインターが指すvectオブジェクトにアクセスします。

vect dir = (*v2) - (*v1);

または、引数を参照として宣言することによって:

bool tri_plane_x(const vect& v1, const vect& v2, const vect& v3, const vect& pos, 
float s){
  ...

またはoperator-、vectへのポインタを受け入れるようにオーバーロードすることもできます。

vect operator-(const vect* other) const
{
     return vect(x-(other->x),y-(other->y),z-(other->z));
}

ここには不要な括弧がいくつかあるかもしれませんが、コードを台無しにする直感に反する操作の順序よりも常に優れていると思います。

于 2013-01-19T21:14:37.960 に答える