【发布时间】: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