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クラスを名前空間に入れると、友達の働き方がどのように変わりますか?
編集:
以下に回答を追加しました。