尝试加倍多重对象后c ++错误c4430

时间:2012-11-22 12:43:52

标签: c++ namespaces

在头文件中的几个类(在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();
}

1 个答案:

答案 0 :(得分:2)

您似乎将多集合插入到同一类型的多集中。 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的实例的类型。它在内部用于组织集合的二叉树结构。这种比较类型必须实现strict weak ordering。在你的情况下,它可能是

形式的东西
classB {
 public:
   classC {
    public:
     bool operator() (const classA& lhs&, const classA rhs&) const {
       return lhs.x() < rhs.x();
     }
   };
};