延迟初始化和模板 - 链接器错误

时间:2012-10-13 18:33:49

标签: templates visual-c++ lazy-initialization unresolved-external

我的申请存在一般性问题。 我想使用我所做的Array类进行延迟初始化,以提高性能;当所有代码都在单个* .h文件中时,一切正常,但是当我将代码拆分为* .h * .cpp文件时,编译器会返回链接器错误。 在头文件中我有一个

template <class T>
class simpleArray { ... some methods\operators declarations. ... }

template <typename T, typename derType=simpleArray<T>>
class myArray{.... some methods\operators declarations. ... }

我明确声明:

template class myArray<double>; 
template class myArray<int>;
template class simpleArray<double>; 
template class simpleArray<int>;

在* .cpp文件中,我实现了方法和运算符。 特别是我有两个赋值运算符:

template <class T, class derType>   
myArray<T,derType>& myArray<T,derType>::operator= (myArray<T,derType> const& right)
    {... some code ...}

template<class T, class derType>
template <class T2, class R2>   
    myArray<T,derType>& myArray<T,derType>::operator= (myArray<T2,R2> const& right) 
    { ... some code ...}

第一个工作正常,第二个(Arra = Array)返回以下错误:

 Error  70  error LNK1120: 1 unresolved externals   
 Error  69  error LNK2019: unresolved external symbol "public: class myArray <double,class simpleArray<double> > & __thiscall myArray <double,class simpleArray<double> >::operator=<int,class simpleArray<int> >(class myArray <int,class simpleArray<int> > const &)" 

请您提出一些解决方案吗?我是否必须在同一个文件中包含所有代码? 我希望已经清楚了。谢谢你的支持!

聚苯乙烯。使用模板时是否有一些关于代码组织的“最佳实践”文档?

1 个答案:

答案 0 :(得分:1)

由于您已在operator=文件中放置了模板.cpp定义,因此引发了此问题:

template <class T, class derType>
template <class T2, class R2>
myArray<T,derType>& myArray<T,derType>::operator=(myArray<T2,R2> const& right)
{ ... }

您正在使用的显式实例化可以与模板类的常规函数​​成员一起使用,但它不适用于模板类的模板函数成员。 仅仅因为在显式instatiation指令中,您只提供实际的TderType类型,它们是类模板参数,但不是T2R2,它们是函数模板参数。

可能的解决方案:

  1. 将模板operator=定义移至.h,以便编译器能够在调用地点实例化它
  2. operator= / TderType / T2的所有可能组合提供模板R2的明确实例化:
  3. 样品:

     // Explicit instantiation of template classes
     template class myArray<double>;
     template class myArray<int>;
     template class simpleArray<double>;
     template class simpleArray<int>; 
    
     // Explicit instantiation of template members
     template myArray<double>& myArray<double>::operator=(myArray<int> const&);
     template myArray<int>& myArray<int>::operator=(myArray<double> const&);
    

    P.S。最佳模板指南仍由David Vandevoorde和Nicolai M. Josuttis C++ Templates. The Complete Guide完成。它还没有涵盖新的C ++ 11功能,但基础知识和最高级的主题仍然是实际的。