下面是一些代碼,概述了我一直在摔跤的問題。最後的問題(就目前而言,g ++而言)是:「執行Bar :: Bar(...)構造函數例程時,錯誤:'Foo-T'未在此範圍內聲明。否則,我試圖學習我的方法的問題是基於使用模板傳遞給派生類構造函數的參數來設置基類成員類型。如果有辦法簡單地通過將參數傳遞給派生類構造函數來設置基類成員類型(T Foo-T),我寧願這樣做。到目前爲止,我看不到使用模板參數和匹配的派生類構造函數參數來完成此任務的方式。你能否在下面的代碼中發現任何事情,我可以更好地實現相同的目標?我對通用編碼和模板比較陌生。在派生類初始化列表中初始化模板基類成員類型
#include <iostream>
typedef int a_arg_t;
typedef double b_arg_t;
typedef std::string foo_arg_t;
class TypeA {
public:
TypeA();
TypeA (a_arg_t a) {
/* Do sosmething with the parameter passed in */
}
};
class TypeB {
public:
TypeB();
TypeB (b_arg_t b) {
/* typeB's constructor - do something here */
}
};
// The base-class with a member-type to be determined by the template argument
template <class T>
class Foo {
public:
Foo (const foo_arg_t foo_arg) : _foo_arg(foo_arg) // initialize something here
{
/* do something for foo */
}
T Foo_T; // either a TypeA or a TypeB - TBD
foo_arg_t _foo_arg;
};
// the derived class that should set the basse-member type (T Foo_T)
template <class T>
class Bar : public Foo<T> {
public:
Bar (const foo_arg_t bar_arg, const a_arg_t a_arg)
: Foo<T>(bar_arg) // base-class initializer
{
// the initialization of Foo_T has to be done outside the initializer list because it's not in scsope until here
Foo_T = TypeA(a_arg); // if an a_arg_t is passed in, then we set the Foo_T to TypeA, etc.
}
Bar (const foo_arg_t bar_arg, const b_arg_t b_arg)
: Foo<T>(bar_arg)
{
Foo_T = TypeB(b_arg);
}
};
int main() {
b_arg_t b_arg;
a_arg_t a_arg;
foo_arg_t bar_arg;
Bar<TypeA> a (bar_arg, a_arg); // try creating the derived class using TypeA
Bar<TypeB> b (bar_arg, b_arg); // and another type for show
return 0;
}
注意:TypeA和TypeB上的默認構造函數需要body,否則會得到鏈接錯誤。 – csj 2009-07-13 07:05:32