[英]C++ operator++ overloading for template iterator of a template generic tree class
我已經開發了一個c ++樹模板類,我想為其編寫一組自定義的迭代器。
GenericTree類迭代器應按以下方式使用:
GenericTree<int> tree;
GenericTree<int>::iterator<PREORDER> preorder_iterator;
for(preorder_iterator = tree.begin(); preorder_iterator != tree.end(); ++preorder_iterato){
//Do something on the node pointed by the preorder_iterator.
}
在上面的示例中,++ preorder_iterator應該為為int和FORWARD類型定義的迭代器類調用重載的operator ++()方法,但代碼不會編譯。 我正在使用g ++(Ubuntu 4.8.2-19ubuntu1)4.8.2
這是迭代器類的代碼。 為了縮短示例,我用向量替換了GenericTree類,並且完全省略了begin()方法的源代碼。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
template<typename P> class GenericTree{
public:
vector<P> data;
GenericTree() {}
~GenericTree(){}
class PREORDER{
};
class POSTORDER{
};
// ----------------------------------------------------------------------------------
template<typename IT> class my_iterator : public std::iterator<std::forward_iterator_tag, P> {
private:
int index;
protected:
public:
my_iterator() { index=0; }
~my_iterator() {}
IT& operator++();
};
// ----------------------------------------------------------------------------------
template<> my_iterator<PREORDER>& my_iterator<PREORDER>::operator++(){
cout << "Preorder visit of GenericTree of nodes containing int values." << endl;
return (*this);
}
template<> my_iterator<POSTORDER>& my_iterator<POSTORDER>::operator++(){
cout << "Postorder visit of GenericTree of nodes containing int values." << endl;
return (*this);
}
};
int main(int argc, char** argv){
GenericTree<int> c_int;
GenericTree<int>::my_iterator<GenericTree<int>::PREORDER> iterator_int;
for(iterator_int = c_int.begin(); iterator_int != c_int.end(); ++iterator_int)
;
GenericTree<string> c_string;
GenericTree<string>::my_iterator<GenericTree<string>::POSTORDER> iterator_str;
for(iterator_str = c_string.begin(); iterator_str != c_string.end(); ++iterator__str)
;
}
盡管是局部的,但先前的代碼返回的錯誤與生成完整源代碼時產生的編譯錯誤相同:
g++ prova.cpp -o prova
prova.cpp:35:11: error: explicit specialization in non-namespace scope ‘class GenericTree<P>’
template<> my_iterator<PREORDER>& my_iterator<PREORDER>::operator++(){
^
prova.cpp:35:70: error: invalid use of incomplete type ‘class GenericTree<P>::my_iterator<GenericTree<P>::PREORDER>’
template<> my_iterator<PREORDER>& my_iterator<PREORDER>::operator++(){
^
prova.cpp:24:30: error: declaration of ‘class GenericTree<P>::my_iterator<GenericTree<P>::PREORDER>’
template<typename IT> class my_iterator : public std::iterator<std::forward_iterator_tag, P> {
^
prova.cpp:40:11: error: explicit specialization in non-namespace scope ‘class GenericTree<P>’
template<> my_iterator<POSTORDER>& my_iterator<POSTORDER>::operator++(){
^
prova.cpp:40:72: error: invalid use of incomplete type ‘class GenericTree<P>::my_iterator<GenericTree<P>::POSTORDER>’
template<> my_iterator<POSTORDER>& my_iterator<POSTORDER>::operator++(){
^
prova.cpp:24:30: error: declaration of ‘class GenericTree<P>::my_iterator<GenericTree<P>::POSTORDER>’
template<typename IT> class my_iterator : public std::iterator<std::forward_iterator_tag, P> {
^
prova.cpp: In function ‘int main(int, char**)’:
prova.cpp:51:27: error: ‘class GenericTree<int>’ has no member named ‘begin’
for(iterator_int = c_int.begin(); iterator_int != c_int.end(); ++iterator_int)
^
prova.cpp:51:58: error: ‘class GenericTree<int>’ has no member named ‘end’
for(iterator_int = c_int.begin(); iterator_int != c_int.end(); ++iterator_int)
^
prova.cpp:57:30: error: ‘class GenericTree<std::basic_string<char> >’ has no member named ‘begin’
for(iterator_str = c_string.begin(); iterator_str != c_string.end(); ++iterator__str)
^
prova.cpp:57:64: error: ‘class GenericTree<std::basic_string<char> >’ has no member named ‘end’
for(iterator_str = c_string.begin(); iterator_str != c_string.end(); ++iterator__str)
^
prova.cpp:57:73: error: ‘iterator__str’ was not declared in this scope
for(iterator_str = c_string.begin(); iterator_str != c_string.end(); ++iterator__str)
^
make: *** [prova] Error 1
我找不到為PREORDER和POSTORDER類型定義operator ++()的兩個模板專業化的正確方法。
如果我使用template<>
關鍵字,則編譯器會抱怨說專業化超出了范圍,我不明白為什么。 將這兩個模板專長移出GenericTree類主體並不能解決問題。
預先感謝您的幫助!
F。
將迭代器類移到GenericTree
之外並部分專門化struct my_iterator
完成此工作。 編譯后可能會有所幫助:
namespace internal
{
class PREORDER {};
class POSTORDER {};
// ------------------------------------------------------------------------------
template<typename P, typename IT>
class my_iterator;
template<typename P>
class my_iterator<P, PREORDER>
: public std::iterator<std::forward_iterator_tag, P>
{
private:
int index;
protected:
public:
my_iterator () { index = 0; }
my_iterator& operator++ () {
std::cout << "Preorder visit of GenericTree of nodes containing int values." << std::endl;
return (*this);
}
};
// ------------------------------------------------------------------------------
template<typename P>
class my_iterator<P, POSTORDER>
: public std::iterator<std::forward_iterator_tag, P>
{
private:
int index;
protected:
public:
my_iterator () { index = 0; }
my_iterator& operator++ () {
std::cout << "Postorder visit of GenericTree of nodes containing int values." << std::endl;
return (*this);
}
};
}
template<typename P> class GenericTree
{
public:
template <typename IT>
using my_iterator = internal::my_iterator<P, IT>;
using PREORDER = internal::PREORDER;
using POSTORDER = internal::POSTORDER;
std::vector<P> data;
GenericTree () {}
~GenericTree () {}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.