我正在将运算符重载与模板类混合使用,并达到了以下的赋值:
j = end - begin;
在我的主函数中,变量类型如下:
ptrdiff_t j;
util::BaseArrayIterator<int, 6> begin, end;
从util::BaseArray初始化了Begin和End:
util::BaseArray<int, 6> ba(SOME_PARAMETERS);
begin = ba.begin(); end = ba.end();
BaseArrayIterator是一种自我实现的迭代器类型。
我遇到了以下错误:
由于消息中的第一条代码语句(删除它可以解决问题),请注意保留HTML标签。我已经包含了一个带有以下定义和声明的头文件: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)
解决了这个问题,但我不想每次都明确指定参数。简洁是支持重载运算符的主要论点之一,因此我希望使用经典的简短形式。
--- 编辑注释2 --- 如Nicola Mussatti所示,[解决方案]:Unresolved external symbol with operator overloading and templates,问题在于友元声明应该移动到类内部。 所以我这样做了,我很开心。 现在将它们分开会出现模棱两可的重载问题,这与以前的错误不同。
}
放错位置了? - Bo Persson