Перегрузка классов C++: возможно ли заставить компилятор видеть, какой использовать на основе шаблона?
Я создал N классов, которые принимают от одного до N целых в конструкторы (и я надеялся, что этого будет достаточно), но, похоже, я ошибаюсь.
Вот 2 примера классов:
template < class T0 , class T1>
class my_map {
typedef T0 type_0;
typedef T1 type_1;
std::map<std::string, type_0* > T0_var;
std::map<std::string, type_1* > T1_var;
friend class apitemp;
public:
my_map( int meaningless0 = 42 , int meaningless1 = 42 ) {}
class apitemp {
std::string n_;
my_map* p;
public: apitemp(std::string name_, my_map* parent) : n_(name_), p(parent) {}
operator type_0*() {return p->T0_var[n_] ; }
operator type_1*() {return p->T1_var[n_] ; }
};
void insert(std::string name, type_0* ptr)
{ T0_var[name] = ptr; }
void insert(std::string name, type_1* ptr)
{ T1_var[name] = ptr; }
apitemp operator[](std::string n_) {return apitemp(n_, this);}
};
template < class T0>
class my_map
{
typedef T0 type_0;
std::map<std::string, type_0* > T0_var;
friend class apitemp;
public:
my_map( int meaningless0 = 42 ) {}
class apitemp
{
std::string n_;
my_map* p;
public:
apitemp(std::string name_, my_map* parent) : n_(name_), p(parent) {}
operator type_0*() {return p->T0_var[n_] ; }
};
void insert(std::string name, type_0* ptr)
{ T0_var[name] = ptr; }
apitemp operator[](std::string n_) {return apitemp(n_, this);}
};
Порядок не имеет значения... когда присутствуют оба класса, я не могу скомпилировать свой код, когда один комментируется (и мы используем API только из одного из 2 классов), все компилируется... но когда я пытаюсь использовать оба, я получаю ошибки компилятора... Так что мне интересно, как сделать такие классы переопределенными?
1 ответ
Вы не можете "перегружать" шаблон количеством параметров типа, которые вы пытаетесь сделать. Правильная реакция на это ограничение зависит от того, что именно вы пытаетесь сделать.
Кажется, что ваша цель здесь состоит в том, чтобы сделать map
который отображается из строки в переменное число значений (устанавливается во время компиляции). Но у вас уже есть такой шаблонный контейнер: std::map
сам!
// This maps to int
std::map<std::string, int> map_to_int;
struct foo {
std::string str;
int i;
};
// This effectively maps to 2 fields
std::map<std::string, struct foo> map_to_struct;
// etc etc
Если бы вам было позволено написать
std::map<std::string, std::string*, int*> does_not_compile;
это не даст вам ничего, что map_to_struct
выше уже не дает.