0

我的申请有一个普遍的问题。我想对我制作的 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 &)" 

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

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

4

1 回答 1

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)
{ ... }

您正在使用的显式实例化适用于模板类的常规函数​​成员,但不适用于模板类的模板函数成员。仅仅因为在显式实例化指令中,您只提供作为类模板参数的实际T和类型,derType而不是作为函数模板参数的类型。T2R2

可能的解决方案:

  1. 将模板operator=定义移至.h,因此编译器将能够在调用位置对其进行实例化
  2. 使用/和/operator=的所有可能组合为模板提供显式实例化:TderTypeT2R2

样本:

 // 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&);

PS 最好的模板指南仍然是C++ 模板。David Vandevoorde 和 Nicolai M. Josuttis的完整指南。它尚未涵盖新的 C++11 功能,但基础知识和最高级的主题仍然是实际的。

于 2012-10-13T22:46:39.367 回答