我正在创建一个组件,模板的泛化。对于创建必须使用字符串标识符。
我正在替换:
#define MYCOMPONENT_CONSTANT_IDENTIFIER "ID value"
与
namespace myComponent
{
static const QString constant_identifier = "ID value"
}
遵循一些编码标准(MISRA,......)。
这应该适用于C ++。我在Constants-only header file C++处查了一下。
此常量在组件“myComponent”的标头中定义,并包含在我的Indexer初始化和创建组件的标头中。这在更换时没有改变。
替换构建成功,但尝试运行失败。 分段错误取决于:
template<>
inline void TMyIndexer::Init()
{
Map(...)
//before
//Map( ENUM_VAL, QSharedPointer<ITableFieldDefs>(new myComponent::TTableFieldDefs(MYCOMPONENT_CONSTANT_IDENTIFIER)) );
Map( ENUM_VAL, QSharedPointer<ITableFieldDefs>(new myComponent::TTableFieldDefs(myComponent::constant_identifier)) );
Map(...)
}
其中:
// TStaticFieldDefs<> implements ITableFieldDefs
typedef TStaticFieldDefs<myComponent::Fields> TTableFieldDefs;
//constructor
TStaticFieldDefs(QString id) : fId(id) {}
如果我上堆:
2。)qstring.h:内联QString :: QString(const QString&amp; other):d(other.d) {Q_ASSERT(&amp; other!= this); D-&GT; ref.ref(); }
1。)qatomic_x86_64.h:内联bool QBasicAtomicInt :: ref()
我认为模板概括,构造函数中的内联定义或其他我不知道的东西有问题。
欢迎任何解释。
我没有想法,我很乐意寻求帮助。
答案 0 :(得分:2)
我的猜测是你试图从静态上下文中使用常量对象。 C ++标准规定静态对象初始化的顺序是未定义的。因此,您可以引用可能导致段错误的未初始化对象。