C ++テンプレート演算子をオーバーロードしてプライベートプロパティにアクセスする方法

オクタビオ

私は現在、C ++ 11で一般的なキー/値のペアをとる単純なテンプレートベースのリンクリストを実装しようとしています。+ =演算子を使用して要素をリストに追加する必要があります。コードは次のようになります。

リスト

// Forward declarations
template<typename K, typename V>
class list;

template<typename K, typename V>
list<K, V> &operator+=(list<K, V> &list, const std::tuple<K, V> ele) {
    if (!list.head) {
        // list is empty
        list.head = new element(ele, nullptr);
    }

    return list;
};

// Class definition
template<typename K, typename V>
class list {
private:
    struct element {
        const K key;
        const V value;
        element *next;

        element(const std::tuple<K, V> tuple, element *ele) :
                key(std::get<0>(tuple)),
                value(std::get<1>(tuple)),
                next(ele) { }
    };

    element *head = nullptr;

public:
    friend list<K, V> &operator+=<>(list<K, V> &list, const std::tuple<K, V> ele);
};

これをコンパイルできません。演算子の実装を前方宣言またはクラス自体に配置する必要がありますか?スニペットのように前方宣言に入れると、「list.head = new element(ele、nullptr);」を使用できないようです。エラー:「要素」の前に型指定子が必要です

クラス自体に入れると、友達でもlist.headにアクセスできません。

ソンユアンヤオ

クラステンプレート定義の前(前方宣言の後)に関数テンプレートの宣言を残してoperator+=、フレンド宣言指定されたテンプレートであることをコンパイラに通知する必要があります。その後、後で定義します。例えば

// Forward declarations
template<typename K, typename V>
class list;

// declaration of function template
template<typename K, typename V>
list<K, V> &operator+=(list<K, V> &l, const std::tuple<K, V> ele);

// Class definition
template<typename K, typename V>
class list {
    ...
    friend list<K, V> &operator+=<>(list<K, V> &l, const std::tuple<K, V> ele);
};

// definition of function template
template<typename K, typename V>
list<K, V> &operator+=(list<K, V> &l, const std::tuple<K, V> ele) {
    if (!l.head) {
        // list is empty
        l.head = new typename list<K, V>::element(ele, nullptr);
    }

    return l;
}

PS:

  1. listクラステンプレートの名前と競合する名前パラメータに名前を付けないでくださいlist

  2. elementはネストされた構造体であるoperator+=ため、のように指定する必要がありますtypename list<K, V>::element

  3. 名前list(と同じstd::listを使用することはお勧めできません。

住む

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

テンプレート関数を使用してベクトルに要素を追加するために<<演算子をオーバーロードする方法は?(c ++)

分類Dev

非型パラメータを持つC ++テンプレートクラス:割り当て演算子をオーバーロードする方法は?

分類Dev

クラスとintパラメータをテンプレートとして使用するC ++オーバーロード演算子+

分類Dev

C ++演算子のオーバーロードテンプレートクラス

分類Dev

c ++-テンプレートクラスでオーバーロードするフレンド演算子

分類Dev

テンプレートクラスを使用したC ++での演算子のオーバーロード

分類Dev

Boost :: variantにアクセスするテンプレートによるC ++演算子[]のオーバーロード

分類Dev

C ++のテンプレートクラスのオーバーロード演算子ostreamが機能しない

分類Dev

[]および=演算子をオーバーロードして、C ++でテンプレートクラスの値を受け入れる

分類Dev

演算子<< C ++のテンプレートクラスのメンバー型のオーバーロード

分類Dev

テンプレート演算子[]が奇妙なC2676をオーバーロードしています

分類Dev

C ++テンプレート内部クラスフレンド演算子のオーバーロード

分類Dev

ネストされた列挙型のテンプレートパラメーターでオーバーロードするC ++フレンド演算子

分類Dev

テンプレートc ++は、一度に複数の演算子をオーバーロードします

分類Dev

C ++テンプレートクラスと演算子のオーバーロード

分類Dev

C ++テンプレートクラスでの演算子のオーバーロードの問題

分類Dev

C ++テンプレートクラスでの演算子のオーバーロードの問題

分類Dev

テンプレート化されたクラスで/演算子をオーバーロードしようとしたC ++エラー

分類Dev

C ++テンプレートメタプログラミング:演算子のオーバーロード

分類Dev

ポリモーフィズムによるC ++テンプレートメソッドのオーバーロードとクラスアクセス

分類Dev

C ++-演算子のオーバーロードを使用してconstテンプレートタイプとnon-constテンプレートタイプを比較することはできません

分類Dev

C ++で演算子オーバーロードを使用してテンプレートを使用することは可能ですか?

分類Dev

ネストされたコレクション内のオブジェクトプロパティを、C#ドライバーを使用してMongoDB内のこのオブジェクトの別のプロパティで更新する

分類Dev

C ++フレンド関数からプライベート配列の要素にアクセスする(演算子<<)

分類Dev

セレンウェブドライバー、NUnit、C#を使用して要素プロパティの子プロパティ値を取得する方法

分類Dev

条件演算子を使用しているときにテンプレート化された値または関数を再帰的に計算するときのエラーC1202(スタックオーバーフロー)

分類Dev

テンプレート化されたクラスで<<演算子をオーバーロードすると、リンカーエラーが発生します(C ++)

分類Dev

C ++ []アクセサーおよびミューテーターとしてオーバーロードするインデックス演算子

分類Dev

サーバー側のC#を使用してクライアント側のフォームプロパティを変更する方法

Related 関連記事

  1. 1

    テンプレート関数を使用してベクトルに要素を追加するために<<演算子をオーバーロードする方法は?(c ++)

  2. 2

    非型パラメータを持つC ++テンプレートクラス:割り当て演算子をオーバーロードする方法は?

  3. 3

    クラスとintパラメータをテンプレートとして使用するC ++オーバーロード演算子+

  4. 4

    C ++演算子のオーバーロードテンプレートクラス

  5. 5

    c ++-テンプレートクラスでオーバーロードするフレンド演算子

  6. 6

    テンプレートクラスを使用したC ++での演算子のオーバーロード

  7. 7

    Boost :: variantにアクセスするテンプレートによるC ++演算子[]のオーバーロード

  8. 8

    C ++のテンプレートクラスのオーバーロード演算子ostreamが機能しない

  9. 9

    []および=演算子をオーバーロードして、C ++でテンプレートクラスの値を受け入れる

  10. 10

    演算子<< C ++のテンプレートクラスのメンバー型のオーバーロード

  11. 11

    テンプレート演算子[]が奇妙なC2676をオーバーロードしています

  12. 12

    C ++テンプレート内部クラスフレンド演算子のオーバーロード

  13. 13

    ネストされた列挙型のテンプレートパラメーターでオーバーロードするC ++フレンド演算子

  14. 14

    テンプレートc ++は、一度に複数の演算子をオーバーロードします

  15. 15

    C ++テンプレートクラスと演算子のオーバーロード

  16. 16

    C ++テンプレートクラスでの演算子のオーバーロードの問題

  17. 17

    C ++テンプレートクラスでの演算子のオーバーロードの問題

  18. 18

    テンプレート化されたクラスで/演算子をオーバーロードしようとしたC ++エラー

  19. 19

    C ++テンプレートメタプログラミング:演算子のオーバーロード

  20. 20

    ポリモーフィズムによるC ++テンプレートメソッドのオーバーロードとクラスアクセス

  21. 21

    C ++-演算子のオーバーロードを使用してconstテンプレートタイプとnon-constテンプレートタイプを比較することはできません

  22. 22

    C ++で演算子オーバーロードを使用してテンプレートを使用することは可能ですか?

  23. 23

    ネストされたコレクション内のオブジェクトプロパティを、C#ドライバーを使用してMongoDB内のこのオブジェクトの別のプロパティで更新する

  24. 24

    C ++フレンド関数からプライベート配列の要素にアクセスする(演算子<<)

  25. 25

    セレンウェブドライバー、NUnit、C#を使用して要素プロパティの子プロパティ値を取得する方法

  26. 26

    条件演算子を使用しているときにテンプレート化された値または関数を再帰的に計算するときのエラーC1202(スタックオーバーフロー)

  27. 27

    テンプレート化されたクラスで<<演算子をオーバーロードすると、リンカーエラーが発生します(C ++)

  28. 28

    C ++ []アクセサーおよびミューテーターとしてオーバーロードするインデックス演算子

  29. 29

    サーバー側のC#を使用してクライアント側のフォームプロパティを変更する方法

ホットタグ

アーカイブ