Wpis z mikrobloga

Cześć wam, umiałby ktoś mi powiedzieć w jaki sposób mogę dodać do wektora dwa obiekty klas pochodnych z typem wskaźnikowym na abstrakcyjną klasę bazową która jest otemplateowana? Wyrzuca mi error: No matching member function for call to 'pushback'

template<typename T = int>
class A
{
protected:
T m_var;
public:
A(T var);
virtual void do_smth() = 0;
T get_var() {return m_var;}
};

template<typename T>
A<T>::A(T var) {
m_var = var;
}

class B : public A <float>
{
public:
B(float var);
void do_smth() override {}
};

B::B(float var) : A(var) {

}

class C : public A <std::string>
{
public:
C(std::string var);
void do_smth() override {}
};

C::C(std::string var) : A(var) {}

int main()
{
std::vector<A<>*> objects;

A<float>* b = new B(1.0);
A<std::string>* c = new C("c class");

objects.push_back(b); // No matching member function for call to 'push_back'
objects.push_back(c);

for (A<>* obj : objects) {
}
std::cout << obj->get_var();
}
return 0;
}

#naukaprogramowania #cpp
  • 5
@MamCieNaHita: Teraz sobie zdałem sprawę, że nad klasą A wrzuciłem coś takiego: template<typename T = int>, czyli defaultowo ustawia typ int jeśli nie podam nic w klamrach, dlatego nie pozwala mi dodać tych obiektów bo są float i string a spodziewa się tylko int bo w wektorze podałem mu puste klamry (czyli defaultowo chce inta).
to, że ileś klas możesz stworzyć templatem nie oznacza, że te klasy mają cokolwiek ze sobą wspólnego.
jak masz
template<class T>
class A{};
to A<int> nie ma nic wspólnego z klasą A<float>. jak chcesz wstawić do jednego wektora różne obiekty, to muszą to być polimorficzne obiekty. no albo std any.
@imthehighestintheroom: Musisz zaimplementować tzw. type erasure, w twoim przypadku to chcesz stworzyć klasę bazową w stosunku do class A, stworzyć wektor takich wskaźników i dodać do niej metodę czysto wirtualną do_smth oraz wypisującą na ostream, którą użyjesz przy przechodzeniu po wektorze, aha i nie zapomnij o wirtualnym destruktorze XD

std::variant sprawdzi się tylko wtedy kiedy będziesz znał wszystkie typy A<T> a to chyba mija się z celem twojego przykładu.