功能模板链接错误

时间:2011-12-27 18:28:47

标签: c++ function-templates

我创建了一个函数模板,允许我获取任何数据类型的数据但是在编译时收到错误消息:

Undefined symbols for architecture i386:
  "bool Json::getData<double>(double, Json&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, DataType)", referenced from:
      Coupon::initCoupon(int const&, Json&)in libkuapay.a(Coupon.o)
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status
scons: *** [kuaposgw] Error 1
scons: building terminated because of errors.

该函数声明为:

 template < class T> static bool getData(T data, Json &jsonObject, const string &key, DataType dataType);

并称为:

 Json::getData (couponList[cpnCnt].discount, couponReader, "discount", realType);

其中couponList[cpnCnt].discount是双倍的。

代码本身在我的“内部”目录中编译得很好但是我在上面得到了错误消息 “外部”目录,后者本质上是内部代码的包装。

2 个答案:

答案 0 :(得分:2)

模板的当前状态通常要求您具有函数声明所在的函数定义。

模板的工作方式,编译器基本上为模板参数的每个变体制作函数的自定义版本。由于编译器不能事先知道所有这些不同的模板参数是什么(将intdouble或某些其他文件中声明的未知类型? )在调用函数之前,它无法创建这些版本。

这意味着在调用函数时,编译器必须可以使用整个函数定义。为了实现这一点,您应该将函数定义放在标题中。

还有其他方法可以做到这一点。类模板的显式实例化。声明过载,其中没有函数的模板参数。但通常,您的整个模板定义必须位于头文件中。

答案 1 :(得分:1)

模板不会在C ++中自动实例化,而是在隐式使用或显式实例化时使用。当使用模板时模板实例化可用时(例如将其放在头文件中),您可以使用该函数触发前一种情况,如@Omnifarious所述。

作为替代方案,您可以使函数非 - static并在源文件中显式实例化它:

template bool getData<double>(double data, Json &jsonObject, const string &key, DataType dataType);