テンプレートクラス(C ++)でフレンドテンプレート関数を宣言することについての質問

BlackieMia

行列のいくつかの関数を実装する割り当てを書いています。これは、問題を修正するための簡略化されたバージョンです。

#include <iostream>
using namespace std;

template<class T>
class CMyMatrix{
private:
    int row;
    int col;
    T** elements;
public:
    CMyMatrix(int row, int col);
    void SetMatrix(T* data, int row, int col);
    friend void DisplayMatrix(CMyMatrix<T> matrix);
};

template<class T>
CMyMatrix<T>::CMyMatrix(int row,int col) {
    this->row = row;
    this->col = col;
    this->elements = new T* [row];
    for (int i = 0;i < row;i++) {
        this->elements[i] = new T[col];
    }
}

template<class T>
void CMyMatrix<T>::SetMatrix(T* data, int row, int col) {
    this->row = row;
    this->col = col;
    if (elements != 0) delete[]elements;
    this->elements = new T* [row];
    for (int i = 0;i < row;i++) {
        this->elements[i] = new T[col];
    }
    for (int i = 0;i < row * col;i++) {
        elements[i / col][i % col] = data[i];
    }
}


template<class T>
void DisplayMatrix(CMyMatrix<T> matrix) {
    for (int i = 0;i < matrix.row;i++) {
        for (int j = 0;j < matrix.col;j++) {
            cout << matrix.elements[i][j] << " ";
            if (j == matrix.col - 1) {
                cout << endl;
            }
        }
    }
}

int main(){
    CMyMatrix<int> matrix(2, 3); 
    int a[6] = {1, 2, 3, 4, 5, 6};
    matrix.SetMatrix(a, 2, 3);
    DisplayMatrix(matrix);
    return 0;
}

私たちの先生は、「DisplayMatrix」をグローバル関数にする必要があるので、クラスCMyMatrixのフレンド関数である必要があると言いました(これ以上関数を書きたくない場合)。しかし、このような例外があります。
コード:LNK2019; 説明:関数_mainで参照される未解決の外部シンボル "void _cdecl DisplayMatrix(class CMyMatrix)"(?DisplayMatrix @@ YAXV?$ CMyMatrix @ H @@@ Z); ライン1; ファイル:CMyMatrix.obj

クラスCMyMatrixの「DisplayMatrix」がIDEで色を変えないことに気付いたので、いくつかの問題があるのではないかと思います。しかし、私はそれを解決する方法がわかりません。誰かが私を助けてくれたら幸いです。

ソンユアンヤオ

friend宣言がグローバルスコープで関数テンプレートの定義と一致していない非テンプレート関数を宣言します。

あなたは出来る

// forward declaration
template<class T>
class CMyMatrix;

// declaration
template<class T>
void DisplayMatrix(CMyMatrix<T> matrix);

template<class T>
class CMyMatrix{
private:
    int row;
    int col;
    T** elements;
public:
    CMyMatrix(int row, int col);
    void SetMatrix(T* data, int row, int col);
    // friend declaration; refering to the function template
    friend void DisplayMatrix<T>(CMyMatrix<T> matrix);
    //                       ^^^
};

...

// definition
template<class T>
void DisplayMatrix(CMyMatrix<T> matrix) {
    for (int i = 0;i < matrix.row;i++) {
        for (int j = 0;j < matrix.col;j++) {
            cout << matrix.elements[i][j] << " ";
            if (j == matrix.col - 1) {
                cout << endl;
            }
        }
    }
}

または、テンプレートを次のfriendように宣言します

template<class T>
class CMyMatrix{
private:
    int row;
    int col;
    T** elements;
public:
    CMyMatrix(int row, int col);
    void SetMatrix(T* data, int row, int col);
    // declares template friend;
    // note that all the instantiations of DisplayMatrix become friend
    template <class X>
    friend void DisplayMatrix(CMyMatrix<X> matrix);
};

...

template<class T>
void DisplayMatrix(CMyMatrix<T> matrix) {
    for (int i = 0;i < matrix.row;i++) {
        for (int j = 0;j < matrix.col;j++) {
            cout << matrix.elements[i][j] << " ";
            if (j == matrix.col - 1) {
                cout << endl;
            }
        }
    }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

'auto'リターン型のテンプレート関数をクラスのフレンドとして宣言することは可能ですか?

分類Dev

クラステンプレートをC ++のクラステンプレートのフレンドとして宣言する

分類Dev

テンプレート関数をテンプレート化されたネストされたクラスのフレンドとして宣言するにはどうすればよいですか?

分類Dev

テンプレートクラスでテンプレートフレンド関数を照合する方法

分類Dev

入力として異なるテンプレートパラメータを持つテンプレートクラスのフレンド関数

分類Dev

両方のクラスの外部のテンプレートクラスの内部の非テンプレートクラスで宣言されたフレンド関数を定義するにはどうすればよいですか?

分類Dev

テンプレートクラスのフレンド関数を呼び出そうとしています

分類Dev

テンプレート基本クラスのテンプレート関数の宣言を使用する

分類Dev

C ++では、テンプレートクラスのメンバー関数を別のクラスのテンプレート型を使用してフレンドにできないのはなぜですか?

分類Dev

パブリックに派生した基本クラステンプレートの関数テンプレートの名前を解決する「このスコープで宣言されていません」エラー

分類Dev

テンプレートクラスフレンドの2つのオブジェクトを(のみ)それらの2つの特殊化に使用するテンプレート関数を宣言します

分類Dev

テンプレートクラスc ++を使用したフレンド関数

分類Dev

テンプレートに依存しないenable_ifを使用する場合の、テンプレートクラスのテンプレートフレンド関数でのリンカエラー

分類Dev

クラステンプレートで関数テンプレートを使用するC ++

分類Dev

同じメインファイルでテンプレート関数のようなテンプレートクラスを前方宣言する方法

分類Dev

C ++の名前空間でテンプレートクラスのフレンド関数を定義する際の問題

分類Dev

内部テンプレートクラスをC ++のテンプレート引数として渡します

分類Dev

ネストされた基本テンプレートクラスインスタンスを派生クラスのフレンドとして宣言する

分類Dev

テンプレートクラスで非テンプレート関数を宣言しますか?

分類Dev

推定クラス型のプレースホルダーで型が指定されている非型テンプレート引数をC ++ 2aの別のテンプレートに渡すことはできますか?

分類Dev

特殊なテンプレート関数として部分的なテンプレートクラスを使用する

分類Dev

C ++クラステンプレートの初期化に関する問題

分類Dev

「クラステンプレートのテンプレート引数の推定」は、可変個引数クラステンプレートの空のパラメータパックを推定することになっていますか?

分類Dev

クラステンプレートと関数テンプレートの混合

分類Dev

テンプレート引数に基づいて、テンプレートクラスのコンストラクターを条件付きで定義する

分類Dev

テンプレートを使用してメンバー関数を宣言する方法は?(テンプレートクラスではありません)

分類Dev

テンプレートクラス(すでに指定されている)でテンプレートメンバー関数を特殊化する方法は?

分類Dev

C ++ 1zでフレンドテンプレートクラステンプレートを宣言するとエラーが発生します:「template <classT> classA」の特殊化は名前空間に表示される必要があります

分類Dev

テンプレート関数によるテンプレートクラスのオーバーロード

Related 関連記事

  1. 1

    'auto'リターン型のテンプレート関数をクラスのフレンドとして宣言することは可能ですか?

  2. 2

    クラステンプレートをC ++のクラステンプレートのフレンドとして宣言する

  3. 3

    テンプレート関数をテンプレート化されたネストされたクラスのフレンドとして宣言するにはどうすればよいですか?

  4. 4

    テンプレートクラスでテンプレートフレンド関数を照合する方法

  5. 5

    入力として異なるテンプレートパラメータを持つテンプレートクラスのフレンド関数

  6. 6

    両方のクラスの外部のテンプレートクラスの内部の非テンプレートクラスで宣言されたフレンド関数を定義するにはどうすればよいですか?

  7. 7

    テンプレートクラスのフレンド関数を呼び出そうとしています

  8. 8

    テンプレート基本クラスのテンプレート関数の宣言を使用する

  9. 9

    C ++では、テンプレートクラスのメンバー関数を別のクラスのテンプレート型を使用してフレンドにできないのはなぜですか?

  10. 10

    パブリックに派生した基本クラステンプレートの関数テンプレートの名前を解決する「このスコープで宣言されていません」エラー

  11. 11

    テンプレートクラスフレンドの2つのオブジェクトを(のみ)それらの2つの特殊化に使用するテンプレート関数を宣言します

  12. 12

    テンプレートクラスc ++を使用したフレンド関数

  13. 13

    テンプレートに依存しないenable_ifを使用する場合の、テンプレートクラスのテンプレートフレンド関数でのリンカエラー

  14. 14

    クラステンプレートで関数テンプレートを使用するC ++

  15. 15

    同じメインファイルでテンプレート関数のようなテンプレートクラスを前方宣言する方法

  16. 16

    C ++の名前空間でテンプレートクラスのフレンド関数を定義する際の問題

  17. 17

    内部テンプレートクラスをC ++のテンプレート引数として渡します

  18. 18

    ネストされた基本テンプレートクラスインスタンスを派生クラスのフレンドとして宣言する

  19. 19

    テンプレートクラスで非テンプレート関数を宣言しますか?

  20. 20

    推定クラス型のプレースホルダーで型が指定されている非型テンプレート引数をC ++ 2aの別のテンプレートに渡すことはできますか?

  21. 21

    特殊なテンプレート関数として部分的なテンプレートクラスを使用する

  22. 22

    C ++クラステンプレートの初期化に関する問題

  23. 23

    「クラステンプレートのテンプレート引数の推定」は、可変個引数クラステンプレートの空のパラメータパックを推定することになっていますか?

  24. 24

    クラステンプレートと関数テンプレートの混合

  25. 25

    テンプレート引数に基づいて、テンプレートクラスのコンストラクターを条件付きで定義する

  26. 26

    テンプレートを使用してメンバー関数を宣言する方法は?(テンプレートクラスではありません)

  27. 27

    テンプレートクラス(すでに指定されている)でテンプレートメンバー関数を特殊化する方法は?

  28. 28

    C ++ 1zでフレンドテンプレートクラステンプレートを宣言するとエラーが発生します:「template <classT> classA」の特殊化は名前空間に表示される必要があります

  29. 29

    テンプレート関数によるテンプレートクラスのオーバーロード

ホットタグ

アーカイブ