2013-07-26 2 views
2

Я создаю компонент, обобщая шаблон. Для создания необходимо использовать строковый идентификатор.Определить замену переменной постоянной переменной

Я замена:

#define MYCOMPONENT_CONSTANT_IDENTIFIER  "ID value" 

с

namespace myComponent 
{ 
    static const QString constant_identifier = "ID value" 
} 

следовать некоторым стандартам codding (Мишра, ...).

Это должно работать в отношении C++. И я проверил его на Constants-only header file C++.

Эта константа определена в заголовке компонента «myComponent» и включена в заголовок, в котором мой Индексатор инициализирован и компонент создан. Это не было изменено во время замены.

Замена строит успешно, но не срабатывает при попытке запустить. hapends неисправностей Сегментация по адресу:

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 (константный QString & другой): d (др.d) {Q_ASSERT (& прочее! = это); D-> ref.ref(); }

1.) qatomic_x86_64.h: инлайн BOOL QBasicAtomicInt :: исх()

Я предполагаю, что есть что-то неправильное в шаблоне обобщения, определения встроенного в конструкторе или что-то еще я не в курсе.

Любые объяснения приветствуются.

У меня нет идей и я прошу помощи.

+2

Вы пробовали полную перестройку? Может быть, также удалив любую временную папку/файл вручную, а затем перестроить? Это фиксировало 90% ошибок сегментации, которые у меня были до сих пор –

+0

Да, я это сделал. Полная очистка и rebuild.I обновил описание. – urkon

+0

Я попытаюсь проверить это на более тривиальный случай. Tim thanx для ответа. – urkon

ответ

2

Я предполагаю, что вы пытаетесь использовать свой постоянный объект из статического контекста. В стандарте C++ указывается, что порядок инициализации статических объектов не определен. Таким образом, вы можете ссылаться на неинициализированный объект, который может вызвать segfault.

+0

Хорошая догадка. Это может быть так. Я сомневаюсь, что константа используется из статического контекста, но постоянная она сама статична и может быть неинициализирована. Это объясняет также ошибку сегментации при постоянном вызове. Я проверю его и постараюсь заменить его на функцию, предложенную в [link] (http://stackoverflow.com/questions/1005685/c-static-initialization-order) ответе. – urkon

+0

Работы. Я повторил 'static const QString constant_identifier =" ID value "' с 'static const QString constant_identifier() {return" ID value ";}' И работает хорошо. Кажется, что встроенное определение и постоянная переменная не соответствуют паре. – urkon

+0

Я рад, что он работает. В моей практике я никогда не видел встроенного определения и постоянных конфликтов. Не могли бы вы сказать, как именно вы называете TMyIndexer :: Init()? –

Смежные вопросы