1

<< 関数で vx、vy、vz を実行しようとしているように、フレンド関数はクラス変数にアクセスできると考えました。しかし、それはコンパイルされません。それらの行で識別子を解決できないと言っています。

また、名前空間の使用方法を学ぼうとしています。実装ファイルで名前空間 vec を使用していますが、すべての前に Vector:: を含める必要があります。

ヘッダー ファイル:

#ifndef VECTOR_H
#define VECTOR_H

namespace vec {

    class Vector {
    private:
        double x, y, z;

    public:
        Vector(double, double, double);
        friend std::ostream& operator<<(std::ostream&,  const Vector&);

    };

}

#endif  /* VECTOR_H */

.cpp ファイル:

#include "Vector.h"
#include <iostream> 
using namespace vec;

//Constructor
Vector::Vector(double x1 = 0, double y1 = 0, double z1 = 0) {
    x = x1;
    y = y1;
    z = z1;
}

//Have also tried adding vec:: and Vector:: before operator<< here.
std::ostream& operator<<(std::ostream& out, const Vector& v) {
    out<<"<"<<v.x<<", "<<v.y<<", "<<v.z<<">";
    return out;
}
4

3 に答える 3

1

問題の一部は、vec.hにがない#include <iostream>ため、そのファイルで型std::ostreamが識別されておらず、その部分がvec.cppの主要部分の前にコンパイルされているため、関数を認識できないことだと思います。

operator<<また、の名前空間にを入れる必要がありますvec。結局のところ、あなたはその名前空間内のフレンド関数を要求しました。

これらの2つの変更により、コードはでコンパイルされgcc -Wall -Wextra -O2ます。

于 2013-02-12T00:46:30.910 に答える
1

コンパイル エラーは、以下の問題に関連している可能性があります。

  • デフォルトのパラメーターは、関数定義ではなく関数宣言にのみ使用されます。逆の方法で行っています。
  • また、Vector.cpp では、クラス メンバー関数の定義を名前空間でラップする必要がありますusing directive

試す:

ベクトル.h

#include <iostream>
class Vector {
    private:
        double x, y, z;

    public:
        Vector(double x1 = 0, double y1 = 0, double z1 = 0);
                        ^^              ^^             ^^
        friend std::ostream& operator<<(std::ostream&,  const Vector&);

    };

ベクトル.cpp

namespace vec
{
   Vector::Vector(double x1, double y1, double z1)
   :x(x1), y(y1), z(z1)
   {
   }
}
于 2013-02-12T00:34:16.107 に答える
0

friend std::ostream& operator<<宣言は名前空間vecに表示されるため、定義の前にvec::. あなたのコメントは、あなたがそれを試みたと言っています - おそらくあなたは他のエラーメッセージbilzドキュメントに混乱しましたが、元に戻すvec::operator<<か、で囲む必要がありますnamespace vec { ... }.

これにより、次のようなエラーが発生します。

ns.cc: In function `int main()':
ns.cc:26: error: ambiguous overload for 'operator<<' in 'std::cout << w'
ns.cc:19: note: candidates are: std::ostream& operator<<(std::ostream&, const vec::Vec&)
ns.cc:10: note:                 std::ostream& vec::operator<<(std::ostream&, const vec::Vec&)
于 2013-02-12T00:36:12.937 に答える