пространства имен — c ++ ошибка c4430 после попытки удвоить объект мультимножества

В паре классов (в пространстве имен vlr) в заголовочных файлах у меня есть открытый член этой формы:

std::multiset<classA,classB::ClassC> data_;

в моей программе он где-то очищен, и поэтому я хочу создать буфер для хранения его содержимого до его потери.
поэтому под каждой строкой объявления старого члена в классах в заголовках я добавляю такую ​​строку:

std::multiset<classA,classB::ClassC> data_buff_;

а затем для буферизации я пишу в некоторый файл .cpp:

data_buff_.insert(data_);

и получить здесь errorC4430: отсутствует указатель типа, предполагается int.
Можете ли вы помочь мне, как я должен правильно буферизовать эти данные, потому что я пытался дать пространство имен в строке, я получаю ошибку, и ничего не помогло.

Большое спасибо!
— — — — — — — — — Обновить — — — — — — — —

ClassA.h:

namespace vlr {
class A{
// some unimportant things
}
}

ClassB.h:

namespace vlr {
class B{
// some unimportant things
public:
class C{
// some unimportant things
}
}
}

ClassD.h:

#include <set>
#include "ClassA.h"#include "ClassB.h"
namespace vlr {
class D {
public:
std::multiset<classA,classB::ClassC> data_;
std::multiset<classA,classB::ClassC> data_buff_;
// some other methods and members
}
}

ClassE.h:

#include <set>
#include "ClassA.h"#include "ClassB.h"
namespace vlr {
class E {
public:
std::multiset<classA,classB::ClassC> data_;
std::multiset<classA,classB::ClassC> data_buff_;
// some other methods and members
}
}

final.cpp:

#include <set>
#include "ClassA.h"#include "ClassB.h"#include "ClassD.h"#include "ClassE.h"namespace vlr{
// something
data_buff_.insert(data_);
data_.clear();
}

0

Решение

Кажется, вы вставляете мультимножество в мультимножество того же типа. std::multiset::insert Метод ожидает объект value_type для этого конкретного мультимножества. Если вы просто хотите скопировать data_ мультикарта в data_buff_ тогда вы можете назначить его:

data_buff_ = data_;

Если вы хотите добавить элементы data_ в data_buf_можно использовать перегрузку двух итераторов insert():

data_.insert(data_.begin(), data_.end());

Мультимножество этого типа:

std::multiset<classA,classB::ClassC>

может содержать объекты типа classA, Вы можете только действительно вставить classA возразить в это. Второй аргумент, classB::classC, должен быть типом, используемым для сравнения экземпляров типа classA, Он используется для организации двоичной древовидной структуры множества. Такой тип сравнения должен реализовывать строгий слабый порядок. В вашем случае это может быть что-то вроде

classB {
public:
classC {
public:
bool operator() (const classA& lhs&, const classA rhs&) const {
return lhs.x() < rhs.x();
}
};
};
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector