Вот какой код, излагающий проблему, с которой я боролся. Последняя проблема (в настоящий момент касается g++) заключается в том, что: "ошибка:" Foo-T "не была объявлена в этой области" при выполнении процедуры конструктора Bar:: Bar (...). В противном случае проблема, с которой я пытаюсь научиться, - это установить типы членов базового класса на основе аргументов, переданных конструктору производного класса с использованием шаблонов. Если бы был способ установить тип элемента базового класса (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 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 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;
}