在模板化 class 中重载 operator=
Overloading operator= in templated class
我正在学习模板,偶然发现了这个问题:
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;
}
如果我这样称呼 class:
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=,比如将template int,std::vector赋值给float,std::deque?
编译器是MSVC2015
尝试将函数设为友元 - 但在友元函数中无法 return *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;
}
};
我正在学习模板,偶然发现了这个问题:
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;
}
如果我这样称呼 class:
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=,比如将template int,std::vector赋值给float,std::deque?
编译器是MSVC2015
尝试将函数设为友元 - 但在友元函数中无法 return *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;
}
};