Je tente de créer une classe qui contient une carte d'un type ou d'un autre, j'ai donc décidé d'utiliser une union anonyme. Mais mon code donne une erreur de segmentation lorsque je tente d'accéder à la carte (dans ce cas, je reçois une erreur de segmentation que dans le constructeur et le destructeur):L'accès à la carte à l'intérieur de la classe à l'intérieur de la classe donne un défaut de segmentation
#include <map>
#include <string>
#include <iostream>
class Foo
{
private:
union
{
std::map<std::string, int> ints;
std::map<std::string, std::string> strings;
};
bool fooContainsInts;
public:
Foo(bool containsInts) : fooContainsInts(containsInts)
{
if (containsInts) {ints = std::map<std::string, int>();}
else {strings = std::map<std::string, std::string>();}
}
~Foo()
{
if (fooContainsInts) {ints.clear();}
else {strings.clear();}
}
};
int main()
{
std::cout << "No segfault here!" << std::endl;
Foo foo(true);
std::cout << "This line doesn't get printed" << std::endl;
return 0;
}
Vous devez utiliser placement new pour construire la carte et appeler manuellement son destructeur. Si vous faites des recherches pour "C++ Unrestricted Union", vous trouverez beaucoup de bonnes ressources. – Cornstalks
Vous ne voulez pas déclarer une classe avec des modèles, n'est-ce pas? – MikeCAT
@MikeCAT Non, ce n'est qu'une version simplifiée de quelque chose d'autre que j'essaie de faire, qui a besoin d'une union avec deux cartes – Orfby