使用模板时未解析的外部
Unresolved external when using templates
本文关键字:外部 更新时间:2023-10-16
我将操作符重新定义与模板类混合,并达到以下赋值:
j = end - begin;
,其中变量类型如下:
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::操作符-,所以他找到了声明,但没有找到定义,尽管它们在同一个文件中。我没有看到签名错误。
——编辑注 -----------------------------------------------------------------------------
替换end-begin
util::operator-<int, 6>(end,begin)
解决了这个问题,但是我不想每次都显式地指定参数。简洁是支持重载操作符的主要参数之一,所以我想使用经典的简短形式。
——编辑注2 ---------------------------------------------------------------------------
正如Nicola Mussatti善意指出的那样,[解决方案]:未解决的外部符号与操作符重载和模板的问题在这里。友元声明应该移到类内部。
所以我做了,我微笑着。现在将它们分开会再次产生歧义的重载问题,这与之前的错误不同。
您使用的是哪个编译器?
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;
}
相关文章:
- 在函数内部的声明中初始化数组,并在外部使用它
- 使外部项目可用于find_package CMake
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- C++:来自外部文件的Trivia
- 从函数角度看ID到文件路径的内部与外部映射
- C++:将外部库链接到dll库
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 节俭并发:未解决的外部问题
- 如何在c++中从git建立外部库
- 未解析的外部符号_MsiLocateComponentW@12.
- 如何使用对C函数和类对象的外部调用来处理C++头文件
- 具有外部"c"和程序集的未定义函数
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 在C++中使用 gRPC 时未解析的外部符号
- 在类函数中初始化外部作用域变量
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 调用外部函数,无法指定类型 C++/MVS
- 同时具有"外部"和"内联"说明符的变量
- LibPrivoxy: 未解析的外部符号 __declspec(dllimport) int __stdcall Sta