故事
我的main.cpp
变得非常混乱所以我决定将其他函数与它分开(main()
中的IO操作的一些辅助函数)。
问题
当函数在{/ strong> main.cpp
中时,文件编译正常。当我将它们放到.h - .cpp
对时,我得到以下编译器错误。
我使用的行
g++ -I ./headers/ ./definitions/*.cpp -o main.o main.cpp
错误:
Undefined symbols for architecture x86_64:
"void showSettings<double>(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>,
std::__1::allocator<char> >,
std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>,
std::__1::allocator<char> > > > const&,
std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >,
std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>,
std::__1::allocator<char> > > > const&, int, int, double, double, int, int, int, int, int)",
referenced from:
_main in main-7k1oIa.o
ld: symbol(s) not found for architecture x86_64
现在唯一可行的解决方案是将功能恢复到main.cpp
。我已经包含了所有必需的标题using namespace std
,并将std::
添加到vector
和string
,但错误仍在显示。
如果有任何帮助,错误中显示的代码为:
template <typename inputType>
void showSettings( const vector<string> &a,
const vector<string> &b,
int eq,
int meth,
inputType root1,
inputType root2,
int sigs,
int showPerLoop,
int plotRoots,
int loopMode,
int minLoops)
答案 0 :(得分:1)
模板仅在被调用时被实例化,因此如果辅助.cpp文件中没有函数调用带有<double>
的showSettings,则表示未创建该函数。
通常,您希望将模板函数保留在.h文件中,以便在需要时可以看到实际定义。
(另见:Why should the implementation and the declaration of a template class be in the same header file?)