我在一个头文件中,在我的一个项目中有以下内容;
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 :(得分: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>;
答案 1 :(得分: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
链接器错误。 / p>