У меня есть класс с одним членом, который является boost::variant
двух типов: vector
целых чисел и vector
объектов класса (последний, очевидно, должен быть сделано с помощью recursive_wrapper
). Код для класса нижеboost :: variant: странное поведение с рекурсивным векторным типом
#include <boost/variant/variant.hpp>
#include <boost/variant/recursive_wrapper.hpp>
#include <vector>
class TestVariant
{
public:
typedef boost::variant< std::vector<int>, boost::recursive_wrapper<std::vector<TestVariant> > > StorageType;
TestVariant():
m_value{ std::vector<int>{} }
{}
TestVariant(const TestVariant& other):
m_value{ other.m_value }
{}
TestVariant& operator=(const TestVariant& other)
{
m_value = other.m_value;
return *this;
}
TestVariant(TestVariant&& other):
m_value{ std::move(other.m_value) }
{}
TestVariant& operator=(TestVariant&& other)
{
m_value = std::move(other.m_value);
return *this;
}
TestVariant(const std::vector<int>& value):
m_value{ value }
{}
TestVariant(std::vector<int>&& value):
m_value{ std::move(value) }
{}
TestVariant(const std::vector<TestVariant>& value):
m_value{ value }
{}
TestVariant(std::vector<TestVariant>&& value):
m_value{ std::move(value) }
{}
private:
StorageType m_value;
};
Когда я пытаюсь использовать этот класс, создав vector
из TestVariant
и emplacing экземпляра рекурсивного экземпляра TestVariant ниже
std::vector<TestVariant> v;
v.emplace_back(std::vector<TestVariant>{ std::vector<TestVariant>{}, std::vector<int>{} }); // access violation!
я получаю «доступ нарушение "в MSVS 2013 и Boost ver 1.53 (я знаю, что это старая версия Boost, но на данный момент я органически ограничен ее использованием). Тот же код на coliru отлично работает (см. here).
Что еще более странно, что если я изменить порядок двух векторов, кажется, что все будет в порядке МСВС 2013
std::vector<TestVariant> v;
v.emplace_back(std::vector<TestVariant>{std::vector<int>{}, std::vector<TestVariant>{} }); // works!
Любые идеи? Я пытаюсь решить эту проблему в течение дня ...
это Wouldn Не удивительно обнаружить, что есть ошибка MSVS2013 или старая версия boost. Это может быть хорошей возможностью утверждать, что ваша организация должна поступать правильно и обновляться? –
@ RichardHodges Я не мог согласиться больше, но винтики поворачиваются медленно, и в то же время мне нужно обходное решение ... –
Помогло ли решение sehe? Я бы предложил попробовать, но поскольку мне стоило 2 дня, чтобы установить vs2015 на моем компьютере с Windows, я не осмеливаюсь попробовать установить бок о бок. В эти дни, если мне нужно написать код для Windows, я использую clang или Cygwin. Я просто не доверяю Microsoft ... –