コンポーネント、テンプレートの一般化を作成しています。作成には文字列識別子を使用する必要があります。
私は交換しています:
#define MYCOMPONENT_CONSTANT_IDENTIFIER "ID value"
と
namespace myComponent
{
static const QString constant_identifier = "ID value"
}
いくつかのコーディング標準 (MISRA など) に従うため。
これは C++ に関しては機能するはずです。そして、Constants-only ヘッダー ファイル C++で確認しました。
この定数は、コンポーネント「myComponent」のヘッダーで定義され、インデクサーが初期化されてコンポーネントが作成されるヘッダーに含まれます。これは交換時に変更されていません。
置換は正常にビルドされますが、実行しようとすると失敗します。セグメンテーション違反は次の場所で発生します。
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 &other) : d(other.d) { Q_ASSERT(&other != this); d->ref.ref(); }
1.) qatomic_x86_64.h: inline bool QBasicAtomicInt::ref()
テンプレートの一般化、コンストラクターのインライン定義、または私が認識していない何かに問題があると思います。
どんな説明でも大歓迎です。
私はアイデアが不足しており、親切に助けを求めています。