2015-09-03 8 views
2

У меня есть следующие 5 файлов: global_vars.h, global_vars.cpp content.h content.cpp main.cpp.Как использовать переменную константы C++ extern для аргумента шаблона в другом файле

global_vars.h

#ifndef global_vars_h 
#define global_vars_h 

namespace Constants{ 

    extern const unsigned int b; 

} 

#endif 

global_vars.cpp

#include "global_vars.h" 

namespace Constants{ 

    extern const unsigned int b(5); 


} 

content.h

#ifndef CONTENT_H_ 
#define CONTENT_H_ 

#include "global_vars.h" 
#include <bitset> 

struct a{ 

    std::bitset<Constants::b> s; 
    int a=10; 

}; 

#endif 

content.cpp

#include "content.h" 

a xVar; 

main.cpp

#include "content.h" 
int main(){ 
    return 0; 
} 

я получаю следующие ошибки:

In file included from content.cpp:1:0: 
content.h:11:31: error: the value of ‘Constants::b’ is not usable in a constant expression 

In file included from content.h:4:0, 
from content.cpp:1: 
global_vars.h:6:28: note: ‘Constants::b’ was not initialized with a constant expression 
extern const unsigned int b; 

Я должен использовать Константы :: б отличных content.cpp файлов/.h (для других bitsets), а так как я могу это сделать? Цените помощь.

спасибо

+0

Вы не должны иметь ключевое слово "extern" в global_vars.cpp. Он запрещает компилятору создавать переменную в двоичном файле global_vars.o. Вы получите сообщение об ошибке, указав, что переменная не определена. – iksess

ответ

2

То, что вы просите, невозможно.

В C++ шаблоны полностью разрешены компилятором, а компоновщик получает только полностью созданные экземпляры классов и функций шаблона. Компилятор получает только код, который находится в данном модуле компиляции.

Таким образом, даже если int является extern const и присвоен значение в некоторой единице компиляции (что делает его действительным во время выполнения), его нельзя использовать в качестве параметра шаблона в любом другом компиляторе. Компилятору не удастся узнать значение этого int в то время, когда оно разрешает, какие экземпляры шаблонов относятся к тем же типам.

Скорее всего, вы можете получить указатель на этот int в качестве параметра шаблона, а затем, если у вас есть, например, функция, использующая этот параметр шаблона, который запускается во время выполнения, может разыменовать указатель, чтобы получить постоянное значение. Если у вас включена оптимизация времени ссылки, она может даже встроить ее, я не уверен.

+0

Могу ли я использовать #define в global_vars.h, чтобы обойти его? – user2105632

+0

Конечно, если есть глобальный файл include, вы можете даже сделать что-то вроде 'struct my_constants {static constexpr int my_int = 42; }; 'Я думаю, что может быть лучше, чем макрос –