我有一个带有一组输入和一组输出变量的程序,我使用XML与Apache/PHP网页进行交换。在该网页中,用户可以看到正在配置/正在进行的内容,并可以更改设置。
当我将XML传递给PHP程序(我们使用Unix_domain套接字)时,我添加了许多关于我传递给他的设置和指示器的元信息。数据类型、最小值、最大值、默认值、读/写权限等。
<temperature datatype="INT32" min=-"40" max="150" permissions="R/O">25</temperature>在构建出站xml时,我需要知道每个变量的元数据。我认为这样做的一个好方法是创建一个类VarInfo,我将其与每个变量相关联。在将变量名作为键存储在映射中时(不确定我是否总能知道变量名),我想到了将键作为指向变量的指针,将值作为指向该变量的VarInfo对象的指针。我所知道的存储混合指针类型的唯一方法是将它们全部转换为void*。所以,就像这样:
bool cmpr( void* a, void*b) { return (long)a < (long)b;};
std::map<void*,VarInfo*,cmpr> VarMap;
int temperature;
VarInfo vi_temperature;
VarMap[(void*)&temperature] = &vi_temperature;这样做会产生一系列关于声明map的错误。
expected a type, got ‘cmpr’ ACT_iod.cpp
Invalid template arguments ACT_iod.cpp line 40 Semantic Error
invalid type in declaration before ‘;’ token
type/value mismatch at argument 3 in template parameter list for
‘template<class _Key, class _Tp, class _Compare, class _Alloc> class std::map’ 那么,有没有人可以建议我如何让它工作,或许还可以建议一种更好的存储metainfo的方法?仍然在考虑改为std::string的作为键。
谢谢。
发布于 2012-06-29 02:53:10
std::map的第三个参数应该是比较器的类型。作为一个修复方法,你可以让cmpr成为一个函数式函数(由于它的不可线性,这通常是首选的方法):
struct cmpr {
bool operator()(void* a, void* b) {...}
}
std::map<void*,VarInfo*,cmpr> VarMap;另一种选择是使用函数指针的类型(bool(*)(void*, void*) iirc),并将指向实际使用的函数的指针作为构造函数的参数:
bool cmpr( void* a, void*b) { return (intptr_t)a < (intptr_t)b;}
std::map<void*,VarInfo*,bool(*)(void*, void*)> VarMap(&cmpr); 编辑:现在我考虑了一下:指针的默认比较是<,所以你可以直接使用std::map<void*, VarInfo*>,它的好处是更容易移植。通常,您应该避免将指针强制转换为long。尽可能避免指针到整数类型转换,否则使用intptr_t、uintptr_t或size_t会更好,因为long不能保证足够大来容纳指针(在一些64位平台上,long确实是32位)。
https://stackoverflow.com/questions/11250873
复制相似问题