8

オペレーターを機能させようとしましたが、エラーがたくさん発生しました。

私のヘッダーファイル

template <unsigned short n>
class Vector {
public:
    std::vector<float> coords;

    Vector();
    Vector(std::vector<float> crds);
    friend std::ostream& operator <<(std::ostream& out, const Vector& v);
};

template <unsigned short n>
Vector<n>::Vector() {
coords.assign(n, 0.0);
}

template <unsigned short n>
std::ostream& operator<<(std::ostream& out, const Vector<n>& v) {
out << "(" << v.coords[1] << " - " << v.coords[2] << ")";
return out;
}

テストファイル

#include <iostream>
#include "vector.h"
using namespace std;

int main() {
Vector<3> toomas;
cout << toomas;

}

エラー:

C:\ CodeBlocks \ kool \ praks3 \ vector.h | 14 |警告:フレンド宣言'std :: ostream&operator <<(std :: ostream&、const Vector&)'は非テンプレート関数を宣言します|

C:\ CodeBlocks \ kool \ praks3 \ vector.h | 14 |注:(これが意図したものでない場合は、関数テンプレートが既に宣言されていることを確認し、ここで関数名の後に<>を追加してください)|

obj \ Debug \ test.o||関数`main'内:|

C:\ CodeBlocks \ kool \ praks3 \ test.cpp | 8 | `operator <<(std :: ostream&、Vector <(unsigned short)3> const&)'への未定義の参照|

4

2 に答える 2

11

エラーを見てください、それは言います、

フレンド宣言'std:: ostream&operator <<(std :: ostream&、const Vector&)'は非テンプレート 関数を宣言します|

つまりoperator<<、テンプレート関数を作成する必要があります。

したがって、クラスでは、次のように宣言する必要があります。

template<unsigned short m> //<----note this: i.e make it template!
friend std::ostream& operator <<(std::ostream& out, const Vector<m>& v);

次に、それを次のように定義します。

template <unsigned short m>
std::ostream& operator<<(std::ostream& out, const Vector<m>& v) {
   out << "(" << v.coords[1] << " - " << v.coords[2] << ")";
   return out;
}
于 2011-03-12T18:20:37.490 に答える
7

クラス内でfriend関数を定義するだけです。

template <unsigned short n>
class Vector
{
public:
    std::vector<float> coords;

    Vector();
    Vector(std::vector<float> crds);
    friend std::ostream& operator <<(std::ostream& out, const Vector& v)
    {
        out << "(" << v.coords[1] << " - " << v.coords[2] << ")";
        return out;
    }
};

template <unsigned short n>
Vector<n>::Vector()
{
    coords.assign(n, 0.0);
}


int main()
{
    Vector<3> toomas;
    cout << toomas;
}

テスト済み:http://ideone.com/LDAR4

または、フォワードプロトタイプを使用して、事前にテンプレート関数を宣言します。

template <unsigned short n>
class Vector;

template <unsigned short n>
std::ostream& operator <<(std::ostream& out, const Vector<n>& v);

template <unsigned short n>
class Vector
{
public:
    std::vector<float> coords;

    Vector();
    Vector(std::vector<float> crds);
    friend std::ostream& operator << <>(std::ostream& out, const Vector& v);
};

template <unsigned short n>
Vector<n>::Vector()
{
    coords.assign(n, 0.0);
}

template <unsigned short n>
std::ostream& operator <<(std::ostream& out, const Vector<n>& v)
{
    out << "(" << v.coords[1] << " - " << v.coords[2] << ")";
    return out;
}

テスト済み:http://ideone.com/8eTeq

于 2011-03-12T18:35:17.740 に答える