1

Vectorクラスを宣言(.h)ファイルと実装(.cpp)ファイルに分割しています。

// a_vector.h
class Vector
    {
    private:
        float f[4];

    public: 
        ...
        // friend operator overloads
        friend Vector operator * (const float& s, const Vector& v);
        friend Vector operator * (const Vector& v, const float& s);
}

// a_vector.cpp
...
// friend operator overloads
Vector operator * (const float& s, const Vector& v)
{
    return Vector(s*v.f[0], s*v.f[1], s*v.f[2], s*v.f[3]);
}

Vector operator * (const Vector& v, const float& s)
{
    return s*v;
}

次に、クラスに名前空間を追加したいと思います。Danny Kalevの記事に続いて、上記の2つのファイルに次の変更を加えました。

// a_vector.h
namespace a
{
    class Vector
        {
        private:
            float f[4];

        public: 
            ...
            // friend operator overloads
            friend Vector operator * (const float& s, const Vector& v);
            friend Vector operator * (const Vector& v, const float& s);
    }
}

// a_vector.cpp
...
// friend operator overloads
a::Vector operator * (const float& s, const a::Vector& v)
{
    return a::Vector(s*v.f[0], s*v.f[1], s*v.f[2], s*v.f[3]);
}

a::Vector operator * (const a::Vector& v, const float& s)
{
    return s*v;
}

*演算子のオーバーロードの最初の定義で、「'f'は'a ::Vector'"のプライベートメンバーである」というデバッグエラーが発生します。友達の定義はクラスのプライベートメンバーにアクセスできると思いましたか?名前空間内にVectorクラスがない場合は、正常に機能します。Vectorクラスを名前空間に入れると、友達の働き方がどのように変わりますか?

編集:

以下に回答を追加しました。

4

1 に答える 1

1

cppファイルでa::名前空間にない別の関数を宣言して定義しているときに、フレンド関数a ::operator*を宣言します。したがって、ヘッダーファイルで宣言したフレンド関数ではありません。operator*をa::operator*に置き換えると修正されます。

于 2016-08-26T10:00:06.660 に答える