【发布时间】:2015-06-09 12:57:48
【问题描述】:
我需要保留一个 std::map 指向模板化对象的指针。 为了摆脱模板,我使用了一个通用的非模板基类。
运行代码时,我收到一个 SIGSEGV 信号。 调试显示问题出在语句
data_[id] = s;
这可能是与对象的初始化顺序有关的问题。
代码如下所示:
文件 shared_iface.h:
class shared_iface {
unsigned long int counter_;
};
文件 shared.h:
extern CommunicationHandler comm;
template <typename T>
class shared: private shared_iface {
public:
shared(): data_(nullptr), id_(0) {
comm.add(id_, this);
}
private:
T* data_;
unsigned long int id_;
};
文件communication_handler.h:
class CommunicationHandler {
public:
inline void add(unsigned long int id, shared_iface* s) {
data_.add(id, s);
}
private:
Dictionary data_;
};
文件communication_handler.cpp:
CommunicationHandler comm;
文件字典.h:
class Dictionary {
public:
Dictionary() {
data_.clear();
}
void add(unsigned long int id, shared_iface* s) {
data_[id] = s;
}
private:
std::map<unsigned long int, shared_iface*> data_;
};
文件 main.cpp:
#include "shared.hpp"
shared<int> c;
int main ()
{
return 1;
}
【问题讨论】:
-
作为旁注,将所有类的成员命名为
data_会造成混淆。像dictionary和interfaces这样更具描述性的名称怎么样? -
静态对象跨编译单元的初始化顺序确实是undefined
标签: c++ templates inheritance g++ stdmap