模板化类的c++操作符重载
C++ operator overloading on templated class
我有一个内部用vector实现的模板化Stack类。
下面是我的(简化的)TStack.h的内容:
#include <vector>
#include <iostream>
template<typename T> class TStack;
template<typename T> TStack<T> operator+(const TStack<T> &s1, const TStack<T> &s2);
template<typename T>
class TStack {
friend TStack<T> operator+<>(const TStack<T> &s1, const TStack<T> &s2);
private:
std::vector<T> items;
public:
void printAll() {
std::cout << "The content of the stack is: ";
typename std::vector<T>::iterator it;
for(it = items.begin(); it < items.end(); it++) {
std::cout << *it << " ";
}
std::cout << std::endl;
}
};
template<typename T>
TStack<T> operator+(const TStack<T> &s1, const TStack<T> &s2) {
TStack<T> result = s1;
typename std::vector<T>::iterator it;
//below is line 41
for(it = s2.items.begin(); it < s2.items.end(); it++) {
result.items.push_back(*it);
}
return result;
}
这是我的(简化的)主类:
#include <iostream>
#include "TStack.h"
using namespace std;
int main(int argc, char *argv[]) {
TStack<int> intStack;
intStack.push(4);
TStack<int> secondIntStack;
secondIntStack.push(10);
cout << "Addition result: " << endl;
//below is line 27
TStack<int> result = intStack + secondIntStack;
result.printAll();
return 0;
}
下面是编译结果:
In file included from main.cpp:2:
TStack.h: In function ‘TStack<T> operator+(const TStack<T>&, const TStack<T>&) [with T = int]’:
main.cpp:27: instantiated from here
TStack.h:41: error: no match for ‘operator=’ in ‘it = s2->TStack<int>::items.std::vector<_Tp, _Alloc>::begin [with _Tp = int, _Alloc = std::allocator<int>]()’
/usr/include/c++/4.4/bits/stl_iterator.h:669: note: candidates are: __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >& __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >::operator=(const __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >&)
make: *** [main.exe] Error 1
我不知道错误信息是什么意思。
在operator+函数中,我使用相同的方法在printAll()中获取迭代器,但它在operator+函数中不能正常工作。我知道我可以避免在operator+函数中使用迭代器,但我只是好奇如何解决这个问题。
用const_iterator
代替iterator
:
typename std::vector<T>::const_iterator it;
因为s1
是const对象。因此,s1.items
也将是const对象,这意味着s1.items.begin()
将返回const_iterator
,而不是非const iterator
。
操作符+()
的更好实现可以改进operator+()
的实现。代替使用手动循环和push_back
函数,您可以使用insert
函数作为:
template<typename T>
TStack<T> operator+(const TStack<T> &s1, const TStack<T> &s2) {
TStack<T> result(s1); //use direct copy-initialization
result.insert(result.end(), s2.begin(), s2.end());
return result;
}
它完全避免了你在代码中遇到的iterator
问题。
operator+()
的更好实现如果按值接受第一个实参,而不是const引用,那就更好了:
template<typename T>
TStack<T> operator+(TStack<T> s1, const TStack<T> &s2) {
s1.insert(s1.end(), s2.begin(), s2.end()); //s1 is a copy, after all!
return s1;
}
由于第一个参数是复制本身,因此不需要显式地创建一个名为result
的局部变量。您可以简单地将s2
添加到s1
并返回s1
。
不能将const迭代器(s2.items.begin()
)赋值给非const迭代器。使用
typename std::vector<T>::const_iterator it;
相关文章:
- 为什么map有操作符[],set没有
- 我可以将C 17 Capture lambda ConstexPR转换操作符的结果用作函数指针模板非类型参数吗?
- c++新操作符通过libstdc++占用大量内存(67MB)
- 复制/移动操作符是否可以安全地用于实现复制/移动分配操作符
- 提升::精神::因果报应使用有条件的替代操作符(|)
- 促进几何体操作符
- 如果操作符delete没有实现,为什么不编译它
- 在使用放置新操作符时,我真的需要担心对齐问题吗
- 我怎样才能让getline操作符工作
- 在重载的全局new操作符中使用静态对象会导致核心转储运行时错误
- 提升ipc new和delete操作符
- 在c++中使用new操作符动态分配数组
- 操作符的大小在C++
- 如何将向量中的对象传递给操作符
- 一个更容易的拷贝分配操作符实现
- 如何重写复杂的c++代码行(嵌套的三元操作符)
- boost::make_shared没有调用(放置)操作符new
- 新操作符(以及malloc)无法分配~450MB的内存
- 类、异常和操作符
- 当delete操作符释放内存时,我为什么需要析构函数