匿名のユニオンを使用することに決めたため、あるタイプのマップを含むクラスを作成しようとしています。クラス内部のマップにアクセスすると、セグメンテーションフォールトが発生する
#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;
}
マップを作成し、そのデストラクターを手動で呼び出すには、プレースメントnewを使用する必要があります。 「C++ unrestricted union」の検索を行うと、多くの優れたリソースが見つかります。 – Cornstalks
テンプレートを使ってクラスを宣言したくないのですか? – MikeCAT
@MikeCATいいえ、これは私がやろうとしている他のものの単純化されたバージョンです.2つのマップでユニオンが必要です – Orfby