0

В одном из моих проектов в файле заголовка есть следующее:Перемещение определения в собственный блок компиляции, сохраняя декларацию в файле заголовка?

auto is_base_type = generic_type_test<const type_expression_base>; 
auto is_array  = generic_type_test<const type_expression_tarray>; 
auto is_named_type = generic_type_test<const type_expression_named>; 

В тех случаях, когда generic_type_test определяется как;

template<typename T> 
bool generic_type_test(const type_expression& arg) 
{ 
    return generic_test<type_expression, T>(arg); 
} 

В том же заголовочном файле.

При компиляции я получаю кучу multiple definition ошибки компоновщика (очевидно)

st_pp.o:ast_pp.cpp:(.data+0x0): multiple definition of `Ast::is_base_type' 
st_helper.o:ast_helper.cpp:(.data+0x0): first defined here 

Так что вопрос, в его простоте, как бы я идти о перемещении своих определений его собственной единицы компиляции (в». cpp "), сохраняя мое объявление в файле заголовка?

Для Jarod42

Применяя вам идею, доходность;

g++ -o build/ast_helper.o -c --std=c++11 -Isrc -Ibuild build/ast_helper.cpp 
build/ast_helper.cpp:11:10: error: conflicting declaration ‘auto Ast::is_base_type’ 
    auto is_base_type = generic_type_test<const type_expression_base>; 
     ^
In file included from build/ast_helper.cpp:1:0: 
src/ast_helper.hpp:54:10: error: ‘Ast::is_base_type’ has a previous declaration as ‘bool (* Ast::is_base_type)(const Ast::type_expression&)’ 
    auto is_base_type = generic_type_test<const type_expression_base>; 
     ^

С линиями;

// Below is line 11 of ast_helper.cpp 
auto is_base_type = generic_type_test<const type_expression_base>; 

// Below is line 54 of ast_helper.hpp 
extern decltype(generic_type_test<const type_expression_base>) is_base_type; 

Также я знаю, что самое простое исправление, будет вперед функция, но мне очень нравится простота указателя функции таким образом.

ответ

0

я нашел удовлетворительное решение, я просто отмечены все эти указатели на функции, как 'Const' так;

const auto is_base_type = generic_type_test<const type_expression_base>; 
const auto is_array  = generic_type_test<const type_expression_tarray>; 
const auto is_named_type = generic_type_test<const type_expression_named>; 

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

0

в заголовке:

extern decltype(generic_type_test<const type_expression_base>)* is_base_type; 

в CPP:

auto is_base_type = generic_type_test<const type_expression_base>; 
+0

Не работает :) – Skeen

+0

Теперь отображаются все символы (и добавление отсутствующих '*') – Jarod42

+0

Не является ли автосогласование const лучшим решением, когда все, что я когда-либо хотел, было алиасом для конкретной шаблонной версии h – Skeen