我正在尝试将一些为 MSVC 编写的代码移植到 Clang 上编译。但是,查找某些模板函数似乎有问题。这是给我带来问题的结构定义的一部分:
template< typename T > struct FixedVector
{
T * ptr;
size_t count;
typedef T value_type;
FixedVector():ptr(0),count(0) {}
~FixedVector()
{
DeleteArr(ptr); // Error message appears here
count=0;
}
// ...
}
该DeleteArr(ptr)
函数指的是稍后定义的函数,如下所示:
template< typename T > inline void DeleteArr( T *& ptr )
{
delete[] ptr;
ptr = NULL;
}
这是我在指示的行上收到的错误消息:
error: call to function 'DeleteArr' that is neither visible in the template definition nor found by argument-dependent lookup
查看错误的完整下拉列表(在 Xcode 中),列表底部显示以下消息:
'DeleteArr' should be declared prior to the call site or in an associated namespace of one of its arguments.
单击此消息将我带到 DeleteArr() 函数的定义,如上所示。
这显然在 MSVC 中编译得很好,并且通过查看 Clang 和 MSVC 之间的差异,这是由于 MSVC 中的一个怪癖,它不需要在使用之前定义这样的函数,只要有某处的定义。所以我在Clang 文档中查找了这个错误消息(相关部分在“模板中的不合格查找”标题下),它建议在模板定义之前添加一个前向声明。所以我在定义之上添加了这个FixedVector
:
template< typename T > inline void DeleteArr( T *& ptr );
但是,此错误消息仍在出现,并且错误消息的最后一位(“应该在调用站点之前声明”位)仍然指向函数的实际定义。有谁知道可能是什么问题?我完全不知道这在 MSVC 上如何有效。还有,既然报错信息可以找到函数的定义,那为什么说找不到呢?
更新:根据评论的建议,我已将 DeleteArr() 的实现添加到我在模板上方声明它的位置。这似乎导致同样的错误!我现在真的很难过。