【问题标题】:Overloading operator= in templated class在模板类中重载 operator=
【发布时间】:2016-03-18 14:28:32
【问题描述】:

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

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>>>'

这种情况下如何实现重载operator=,例如将模板int、std::vector赋值给float、std::deque?

编译器是MSVC2015

试图将函数设为朋友 - 但在朋友函数中无法返回 *this。

试图让这个函数成为非成员 - MSVC 告诉我不能让 operator= 非成员

【问题讨论】:

    标签: c++ templates operator-overloading


    【解决方案1】:

    首先,不要只为任何东西重载赋值,而只为同一模板的其他特化。其次,将所有专业化friends 相互关联:

    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;
        }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多