从main.cpp中分离一些函数时,获取“未定义的体系结构符号”错误,该怎么办?

时间:2014-01-06 12:21:23

标签: c++ g++

故事

我的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::添加到vectorstring,但错误仍在显示。

如果有任何帮助,错误中显示的代码为:

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)

1 个答案:

答案 0 :(得分:1)

模板仅在被调用时被实例化,因此如果辅助.cpp文件中没有函数调用带有<double>的showSettings,则表示未创建该函数。

通常,您希望将模板函数保留在.h文件中,以便在需要时可以看到实际定义。

(另见:Why should the implementation and the declaration of a template class be in the same header file?