名前空間のテンプレートで宣言されたフレンド演算子を定義するにはどうすればよいですか?

ファラプ

私はこのようなクラスを持っています:

namespace N
{
  template<unsigned Mantissa, unsigned Fraction>
  class C
  {
  //...
  public:
    friend C<Mantissa, Fraction> operator +(const C<Mantissa, Fraction> & left, const C<Mantissa, Fraction> & right);
  //...
  };
}

そして、私はそれをoperator +個別に定義しようとしてきましたが、それを機能させることができません。

私はもう試した:

    template<unsigned Mantissa, unsigned Fraction>
    N::C<Mantissa, Fraction> N::operator+(const N::C<Mantissa, Fraction> & left, const N::C<Mantissa, Fraction> & right)
    {
        //...
    }

しかし、「C2244 '演算子+':関数定義を既存の宣言と一致させることができません」というメッセージが表示されます。

私はもう試した:

    template<unsigned Mantissa, unsigned Fraction>
    N::C<Mantissa, Fraction> operator+(const N::C<Mantissa, Fraction> & left, const N::C<Mantissa, Fraction> & right)
    {
        //...
    }

しかし、リンカーエラーが発生します。

私はもう試した:

namespace N
{
    template<unsigned Mantissa, unsigned Fraction>
    C<Mantissa, Fraction> operator+(const C<Mantissa, Fraction> & left, const C<Mantissa, Fraction> & right)
    {
        //...
    }
}

しかし、同じリンカーエラーが発生します。

問題が何であるか、またはそれを解決する方法がわかりません。フィールドにアクセスしてoperatorいるfriendためこれはである必要がありprivateます(フィールドを作成する必要があります。publicそれ以外の場合は、回避できる場合は実行したくありません)。

ソンユアンヤオ

operator+クラス定義内で非テンプレート関数として宣言されていますが、後で関数テンプレートとして定義しようとしていますが、一致しません。関数テンプレートにしたい場合は、次のことができます。

namespace N
{
  // forward declaration of the class template
  template<unsigned Mantissa, unsigned Fraction>
  class C;
  // forward declaration of the function template
  template<unsigned Mantissa, unsigned Fraction>
  C<Mantissa, Fraction> operator +(const C<Mantissa, Fraction> & left, const C<Mantissa, Fraction> & right);

  template<unsigned Mantissa, unsigned Fraction>
  class C
  {
  //...
  public:
    // the instantiation of operator+ with template parameter of current Mantissa and Fraction becomes friend
    friend C<Mantissa, Fraction> operator + <>(const C<Mantissa, Fraction> & left, const C<Mantissa, Fraction> & right);
    //                                      ~~
  //...
  };
}

// definition of the function template
template<unsigned Mantissa, unsigned Fraction>
N::C<Mantissa, Fraction> N::operator+(const N::C<Mantissa, Fraction> & left, const N::C<Mantissa, Fraction> & right)
{
    //...
}

これを非テンプレート関数にしたい場合は、クラス定義内で定義するだけです。

namespace N
{
  template<unsigned Mantissa, unsigned Fraction>
  class C
  {
  //...
  public:
    // defined as non-template
    friend C<Mantissa, Fraction> operator +(const C<Mantissa, Fraction> & left, const C<Mantissa, Fraction> & right) {
      //...
    }
  //...
  };
}

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

名前空間内で宣言されたフレンド演算子を定義する警告

分類Dev

テンプレートクラス内でフレンドのユーザー定義リテラル演算子を宣言するにはどうすればよいですか?

分類Dev

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

分類Dev

名前空間内でユーザー定義のリテラル演算子を参照するにはどうすればよいですか?

分類Dev

別の名前空間でオーバーロードされた演算子を指定するにはどうすればよいですか?

分類Dev

std :: sortと名前空間のテンプレート化されたスワップの間に名前の衝突がないようにするにはどうすればよいですか?

分類Dev

パイプ%>%演算子で渡されるデータフレームの行名を設定するにはどうすればよいですか?

分類Dev

XML名前空間プレフィックスをインラインxmlns宣言に置き換えるにはどうすればよいですか?

分類Dev

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

分類Dev

匿名名前空間のgdbにブレークポイントを設定するにはどうすればよいですか?

分類Dev

テンプレートクラスに演算子のオーバーロードを実装するにはどうすればよいですか?

分類Dev

汎用テンプレートを使用してクラスの演算子をオーバーロードするにはどうすればよいですか?

分類Dev

クラステンプレートの非メンバー演算子のオーバーロードを定義するにはどうすればよいですか?

分類Dev

フィルタ付きのVueテンプレートで三項演算子を使用するにはどうすればよいですか?

分類Dev

ES6で2つのスプレッド演算子の間に論理演算子を設定するにはどうすればよいですか?

分類Dev

定義とは別にvoidに部分的に特殊化されたテンプレートを実装するにはどうすればよいですか?

分類Dev

C ++のテンプレートに特定の演算子が定義されているかどうかをどのように確認しますか?

分類Dev

Angular 2テンプレートで変数を定義するにはどうすればよいですか?

分類Dev

完全に特殊化されたテンプレートクラスの定義の外でテンプレートメンバー関数を定義するにはどうすればよいですか?

分類Dev

完全に特殊化されたテンプレートクラスの定義の外でテンプレートメンバー関数を定義するにはどうすればよいですか?

分類Dev

宣言された名前空間をAngularDIで注入するにはどうすればよいですか?

分類Dev

スコープ解決演算子を使用すると、グローバル名前空間でオーバーロードされたテンプレートが呼び出されるのはなぜですか?

分類Dev

SAMテンプレートで定義された役割を参照するにはどうすればよいですか?

分類Dev

テンプレート配列演算子のオーバーロード関数を呼び出すにはどうすればよいですか?

分類Dev

非型テンプレートクラスを特殊化するために、宣言の外部でメソッドを定義するにはどうすればよいですか?

分類Dev

マップされたネットワーク共有の「フレンドリ名」を読み取るにはどうすればよいですか?

分類Dev

定義された名前空間スキーマでsaxonを使用して、名前空間のないファイルを検証するにはどうすればよいですか?

分類Dev

PowerPointテンプレートでデフォルトのファイル名を設定するにはどうすればよいですか?

分類Dev

生成されたXMLのエンコードスタイルと名前空間を変更するにはどうすればよいですか?

Related 関連記事

  1. 1

    名前空間内で宣言されたフレンド演算子を定義する警告

  2. 2

    テンプレートクラス内でフレンドのユーザー定義リテラル演算子を宣言するにはどうすればよいですか?

  3. 3

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

  4. 4

    名前空間内でユーザー定義のリテラル演算子を参照するにはどうすればよいですか?

  5. 5

    別の名前空間でオーバーロードされた演算子を指定するにはどうすればよいですか?

  6. 6

    std :: sortと名前空間のテンプレート化されたスワップの間に名前の衝突がないようにするにはどうすればよいですか?

  7. 7

    パイプ%>%演算子で渡されるデータフレームの行名を設定するにはどうすればよいですか?

  8. 8

    XML名前空間プレフィックスをインラインxmlns宣言に置き換えるにはどうすればよいですか?

  9. 9

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

  10. 10

    匿名名前空間のgdbにブレークポイントを設定するにはどうすればよいですか?

  11. 11

    テンプレートクラスに演算子のオーバーロードを実装するにはどうすればよいですか?

  12. 12

    汎用テンプレートを使用してクラスの演算子をオーバーロードするにはどうすればよいですか?

  13. 13

    クラステンプレートの非メンバー演算子のオーバーロードを定義するにはどうすればよいですか?

  14. 14

    フィルタ付きのVueテンプレートで三項演算子を使用するにはどうすればよいですか?

  15. 15

    ES6で2つのスプレッド演算子の間に論理演算子を設定するにはどうすればよいですか?

  16. 16

    定義とは別にvoidに部分的に特殊化されたテンプレートを実装するにはどうすればよいですか?

  17. 17

    C ++のテンプレートに特定の演算子が定義されているかどうかをどのように確認しますか?

  18. 18

    Angular 2テンプレートで変数を定義するにはどうすればよいですか?

  19. 19

    完全に特殊化されたテンプレートクラスの定義の外でテンプレートメンバー関数を定義するにはどうすればよいですか?

  20. 20

    完全に特殊化されたテンプレートクラスの定義の外でテンプレートメンバー関数を定義するにはどうすればよいですか?

  21. 21

    宣言された名前空間をAngularDIで注入するにはどうすればよいですか?

  22. 22

    スコープ解決演算子を使用すると、グローバル名前空間でオーバーロードされたテンプレートが呼び出されるのはなぜですか?

  23. 23

    SAMテンプレートで定義された役割を参照するにはどうすればよいですか?

  24. 24

    テンプレート配列演算子のオーバーロード関数を呼び出すにはどうすればよいですか?

  25. 25

    非型テンプレートクラスを特殊化するために、宣言の外部でメソッドを定義するにはどうすればよいですか?

  26. 26

    マップされたネットワーク共有の「フレンドリ名」を読み取るにはどうすればよいですか?

  27. 27

    定義された名前空間スキーマでsaxonを使用して、名前空間のないファイルを検証するにはどうすればよいですか?

  28. 28

    PowerPointテンプレートでデフォルトのファイル名を設定するにはどうすればよいですか?

  29. 29

    生成されたXMLのエンコードスタイルと名前空間を変更するにはどうすればよいですか?

ホットタグ

アーカイブ