我嘗試用模板派生類使用訪問者模式與模板派生類
我與海灣合作委員會的工作4.5
這裏是VisitorTemplate.hpp,我專門在派生類實現Visitor模式參觀者,但我希望能夠處理任何類型:
編輯:感謝interjay的建議,代碼編譯和運行沒有錯誤,現在
#ifndef VISITORTEMPLATE_HPP_
#define VISITORTEMPLATE_HPP_
#include <iostream>
#include <string>
using namespace std;
template<class T> Derived;
class Visitor
{
public:
virtual void visit(Derived<string> *e) = 0;
};
class Base
{
public:
virtual void accept(class Visitor *v) = 0;
};
template<class T>
Derived: public Base
{
public:
virtual void accept(Visitor *v)
{
v->visit(this);
}
string display(T arg)
{
string s = "This is : " + to_string(arg);
return s;
}
};
class UpVisitor: public Visitor
{
virtual void visit(Derived<string> *e)
{
cout << "do Up on " + e->display("test") << '\n';
}
};
class DownVisitor: public Visitor
{
virtual void visit(Derived<string> *e)
{
cout << "do Down on " + e->display("test") << '\n';
}
};
#endif /* VISITORTEMPLATE_HPP_ */
的main.cpp
Base* base = new Derived<string>();
Visitor* up = new UpVisitor();
Visitor* down = new DownVisitor();
base->accept(up);
base->accept(down);
現在我的目標是使用派生訪問中沒有專業;不幸的是,訪問是一種虛擬的方法,所以我不能模板它
你使用什麼編譯器?我只是將您的示例代碼提供給Visual C++ 2010,並且它非常高興地編譯,除了抱怨std :: to_string無法處理模板參數參數類型。我在你的示例代碼中看不到任何理由,爲什麼它會抱怨一個不完整的類型,因爲你不會錯過爲單一的純虛函數提供實現。 –
@MthetheWWalton:「我使用gcc 4.5。」但是,指出編譯器消息引用的行總是很好的。我不想在瀏覽器中計算31行。 – sbi
@sbi doh,我一定忘記了當我給編譯器提供代碼時。不過,我不認爲那種特殊類型的錯誤是GCC和VC++不同意的。 –