C++ 模板如何重载运算符和访问私有(private)属性

标签 c++ templates overloading operator-keyword friend

我目前正在尝试实现一个简单的基于模板的链表,该链表采用 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);”。错误:“元素”之前需要类型说明符

如果我将它放入类本身,即使它是 friend ,我也无法访问 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;
}

附言:

  1. 不要将参数命名为 list , 这与类模板的名称冲突 list .

  2. element是嵌套结构,在 operator+= 中你应该指定它像 typename list<K, V>::element .

  3. 使用姓名 list (与 std::list 相同)不是一个好主意。

LIVE

关于C++ 模板如何重载运算符和访问私有(private)属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47297449/

相关文章:

c++ - Const 和引用成员函数限定符

c++ - 在评估中使用多个 'greater-than/less-than' 比较器是否合适?

具有外部实现的 C++ 静态模板

C++ 模板和内联

c++ - 如何编码和重载返回自身的函数? C++17

c++ - 创建接收参数的新异常

c++ - 共享列表、多个条件、一个或多个条件变量?

c++ - 如何定义一个模板类并将其分成多个文件?

C11 类型泛型表达式 - 为什么不直接添加函数重载?

c# - 泛型函数重载