重载模板类中的运算符=

Overloading operator= in templated class

本文关键字:运算符 重载      更新时间:2023-10-16

我正在学习模板,偶然发现了这个问题:

template <typename T, typename CONT>
class someContainer {
public:
    someContainer (const std::initializer_list<T>& ini) {
        for (const auto& elem : ini) {
            m_cont.push_back(elem);
        }
    }
    template <typename DST_CONT>
    someContainer& operator=(const DST_CONT& cont) {
        m_cont.clear();
        for (const auto& elem : cont.m_cont) {
            m_cont.push_back(static_cast<T>(elem));
        }
        return *this;
    }
private:
    CONT m_cont;
}

如果我这样称呼这个类:

someContainer <int, std::vector<int>> ivec{ 1,2 };
someContainer <int, std::vector<int>> ivec2{ 1,2,3 };
ivec = ivec2;

此处m_cont将由1,2,3 正确分配正确的值

但是,如果我这样做:

someContainer <int, std::vector<int>> ivec{ 1,2 };
someContainer <int, std::deque<int>> ivec2{ 1,2,3 };
ivec = ivec2;

分配操作将失败:

cannot access private member declared in class 'someContainer<int,std::deque<int,std::allocator<_Ty>>>'

在这种情况下,如何实现重载运算符=,例如,将模板int,std::vector分配给float,std:::deque?

编译器是MSVC2015

尝试将函数设为friend,但在friend函数中不可能返回*this。

尝试使此函数成为非成员-MSVC告诉我不能使operator=非成员

首先,不要只为任何事情重载赋值,而只为同一模板的其他专业化重载赋值。第二,使所有专业化相互friend

template <typename T>
class X
{
    T m_;
    template <typename> friend class X;  // all specializations of X are friends
public:
    template <typename U>
    X & operator=(const X<U> & rhs)      // assign from any specialization of X
    {
        m_ = rhs.m_;
        return *this;
    }
};