2016-04-18 4 views
-1

Итак, у меня есть класс, который имеет в основном статические вещи, потому что он должен быть доступной библиотекой во все времена без создания экземпляра. Во всяком случае, этот класс имеет открытый статический член, структуру cfg, которая содержит все свои параметры конфигурации (в основном границы и допуски для алгоритмов, реализуемых его статическими методами). И сверху он имеет константный статический член, который является структурой того же типа, что и cfg, но имеет все стандартные/обычные значения для параметров. Пользователи моего модуля могут загрузить его, частично модифицировать и применить его как cfg, или использовать его в качестве ссылки, или что я знаю.C++ <11: Инициализировать статический член класса const

Теперь я не могу инициализировать этого парня вообще. Без создания экземпляра (и его статического) инициализация не будет выполняться в конструкторе (в любом случае его нет). In-class init возвращает ошибку, init в cpp возвращает конфликт объявления. Каков путь вперед?

Вот пример с точно таким же поведением, как я получаю:

module.h:

#ifndef MODULE_H 
#define MODULE_H 

typedef struct { 
    float param1; 
    float param2; 
} module_cfg; 

class module 
{ 
    public: 
     module(); 
     static module_cfg cfg; 
     const static module_cfg default_cfg; 

}; 

#endif // MODULE_H 

module.cpp:

#include "module.h" 
using namespace std; 

module_cfg module::default_cfg = {15, 19}; 

int main(int argc, char* argv[]) 
{ 
    //clog << "Hello World!" << endl << endl; 

    return 0; 
} 

module::module() 
{ 
} 

Ошибки с выше:

модуля .cpp: 11: 20: ошибка: конфликтная декларация 'module_cfg module :: default_cfg' module_cfg module :: default_cfg = {15, 19}; ^ В файле, включенном в module.cpp: 8: 0: module.h: 14: 29: error: 'module :: default_cfg' имеет предыдущее объявление как 'const module_cfg module :: default_cfg' const static module_cfg default_cfg ; ^ Makefile.Debug: 119: рецепт для цели 'debug/module.o' не удалось module.cpp: 11: 20: error: объявление 'const module_cfg module :: default_cfg' вне класса не является определением [-fpermissive ] module_cfg module :: default_cfg = {15, 19};

Спасибо заранее,

Чарльз

+0

Это звучит как вариации одноточечного, но было бы лучше, чтобы увидеть код класса и примеры использования – user3159253

+1

инициализации в файле CPP бы быть путь. Пожалуйста, покажите нам [mcve] (/ help/mcve), который воспроизводит ошибку, которую вы видите. – MikeMB

+0

Должна ли конфигурация по умолчанию быть как-то зависимой от '.cfg'? – user3159253

ответ

1

Ошибки выше из-за того, что вы неосторожно default_cfg повторного объявления, чтобы быть изменяемым в файле CPP.

добавления сопзЬ к определению фиксирует это:

const module_cfg module::default_cfg = {15, 19}; 
Смежные вопросы