CPP文件中的C ++ 11模板定义,未定义的引用

时间:2012-08-21 00:04:00

标签: c++ templates c++11 linker-errors

我发现了一些C ++ 11功能并遇到了问题。 我有一个成员函数'call'

class cscript
{
public:
template <typename ret_t, typename... params>
    bool call(ret_t &ret, const char * name, params... parameters);
....

实现:

template <typename ret_t, typename... params>
bool cscript::call(ret_t &ret, const char * name, params... parameters)
{
    ret_t (*func)(params...);
    func = (decltype(func)) tcc_get_symbol(tcc, name);
    if (!func)
        return true;

    ret = func(parameters...);

    return false;
}

链接时显示以下错误:

obj\Release\main.o:main.cpp:(.text.startup+0xcc)||undefined reference to `bool cscript::call<int, int, int>(int&, char const*, int, int)'|

致电示例:

script.call(ret, "sum", 2, 3);

有关如何使这项工作的任何建议?

1 个答案:

答案 0 :(得分:5)

从外观上看,模板定义在使用时不可见。也就是说,编译器在看到cscript::call()的实现时不知道它需要传递什么模板参数,并且它不知道在使用它时实现是什么样的。您有两个基本选项:

  1. cscript::call()的定义放入标题中,以便在使用时始终可以看到它。
  2. 明确地实例化你正在使用的`csscript :: call()的版本。
  3. 后者看起来像下面的某个地方,在实现文件中的定义之后:

    template bool cscript::call<int, int, int>(int&, char const*, int, int);
    

    从它的外观来看,你想要使用这个模板的几个不同版本,你可能不想重复。因此,您可能希望将定义放入标题中。