2

コンポーネント、テンプレートの一般化を作成しています。作成には文字列識別子を使用する必要があります。

私は交換しています:

#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()

テンプレートの一般化、コンストラクターのインライン定義、または私が認識していない何かに問題があると思います。

どんな説明でも大歓迎です。

私はアイデアが不足しており、親切に助けを求めています。

4

1 に答える 1