我的申请存在一般性问题。 我想使用我所做的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 &)"
请您提出一些解决方案吗?我是否必须在同一个文件中包含所有代码? 我希望已经清楚了。谢谢你的支持!
聚苯乙烯。使用模板时是否有一些关于代码组织的“最佳实践”文档?
答案 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指令中,您只提供实际的T
和derType
类型,它们是类模板参数,但不是T2
和R2
,它们是函数模板参数。
可能的解决方案:
operator=
定义移至.h
,以便编译器能够在调用地点实例化它operator=
/ T
和derType
/ T2
的所有可能组合提供模板R2
的明确实例化:样品:
// 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功能,但基础知识和最高级的主题仍然是实际的。