我将运算符重新定义与模板类混合,并达到以下分配:
j = end - begin;
在我的main函数中,变量类型如下:
ptrdiff_t j;
util::BaseArrayIterator<int, 6> begin, end;
从util :: BaseArray初始化了开始和结束:
util::BaseArray<int, 6> ba(SOME_PARAMETERS);
begin = ba.begin(); end = ba.end();
BaseArrayIterator是一个自我实现的迭代器类型。
我收到错误:
TestProject.obj : error LNK2019: unresolved external symbol "int __cdecl util::operator-(class util::BaseArrayIterator<int,6> const &,class util::BaseArrayIterator<int,6> const &)" (??Gutil@@YAHABV?$BaseArrayIterator@H$05@0@0@Z) referenced in function _main
由于消息中的第一个代码语句(删除它修复了问题)。
我已经包含了一个带有以下定义和声明的头文件:
namespace util {
template<typename T, int n>
typename BaseArrayIterator<T,n>::difference_type operator -
(const BaseArrayIterator<T,n> &itL,
const BaseArrayIterator<T,n> &itR);
...
template<typename T, int n>
typename BaseArrayIterator<T,n>::difference_type operator -(
const BaseArrayIterator<T,n> &itL,
const BaseArrayIterator<T,n> &itR)
{ return -(itL.m_cnt - itR.m_cnt);
}
}
导致问题的原因是什么? 编译器报告搜索util :: operator - ,因此他确实找到了声明,但没有找到定义,尽管它们位于同一个文件中。我认为没有签名错误。
---编辑注意------------------------------------------ -----------------------------------
更换
end-begin
与
util::operator-<int, 6>(end,begin)
解决了这个问题,但我不想每次都明确指定参数。 Concision是支持重载运算符的主要参数之一,所以我想使用经典的简表。
---编辑说明2 ----------------------------------------- ----------------------------------
正如Nicola Mussatti所说,[解决方案]:问题的Unresolved external symbol with operator overloading and templates就在这里。朋友声明应该在课堂内移动。
所以我做了,我笑了。 现在将它们再次分开会发出一个模糊的过载问题,这与之前的错误不同。
答案 0 :(得分:0)
您使用的是哪种编译器?
VS2010对此代码感到满意:
namespace util
{
template<typename T>
class BaseArrayIterator
{
public:
typedef ptrdiff_t difference_type;
int pos;
T x;
};
template<typename T>
typename BaseArrayIterator<T>::difference_type operator -
(const BaseArrayIterator<T> &itL,
const BaseArrayIterator<T> &itR);
template<typename T>
typename BaseArrayIterator<T>::difference_type operator -
(const BaseArrayIterator<T> &itL,
const BaseArrayIterator<T> &itR)
{
return itL.pos - itR.pos;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
util::BaseArrayIterator<int> a;
util::BaseArrayIterator<int> b;
ptrdiff_t dist = a - b;
return 0;
}