私は現在、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:
list
クラステンプレートの名前と競合する名前でパラメータに名前を付けないでくださいlist
。
element
はネストされた構造体であるoperator+=
ため、のように指定する必要がありますtypename list<K, V>::element
。
名前list
(と同じstd::list
)を使用することはお勧めできません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加