模板定义找不到我的功能

ben*_*wad 4 c++ scope clang visual-c++

我正在尝试将一些为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;
    }
// ...
}
Run Code Online (Sandbox Code Playgroud)

DeleteArr(ptr)函数指的是稍后定义的函数,如下所示:

template< typename T > inline void DeleteArr( T *& ptr )
{
    delete[] ptr;
    ptr = NULL;
}
Run Code Online (Sandbox Code Playgroud)

这是我在指示的行上显示的错误消息:

error: call to function 'DeleteArr' that is neither visible in the template definition nor found by argument-dependent lookup
Run Code Online (Sandbox Code Playgroud)

查看错误的完整下拉列表(在Xcode中),以下消息位于列表的底部:

'DeleteArr' should be declared prior to the call site or in an associated namespace of one of its arguments.
Run Code Online (Sandbox Code Playgroud)

单击此消息将带我进入DeleteArr()函数的定义,如上所示.

这显然在MSVC中编译好了,并且通过查看Clang和MSVC之间的差异,这是由于MSVC中的一个怪癖,在使用它们之前不需要定义这样的函数,只要有一个在某处定义.因此,我在Clang文档中查找了此错误消息(相关部分位于标题"模板中的不合格查找"下),并建议在模板定义之前添加前向声明.所以我在上面添加了以下定义FixedVector:

template< typename T > inline void DeleteArr( T *& ptr );
Run Code Online (Sandbox Code Playgroud)

但是,此错误消息仍然出现,并且错误消息的最后一位('应在调用站点之前声明'位)仍然指向函数的实际定义.有谁知道可能是什么问题?我对MSVC的有效性一无所知.此外,由于错误消息可以找到函数的定义,为什么说它无法找到?

更新:根据评论的建议,我已将DeleteArr()的实现添加到我在模板上方声明的位置.这似乎导致了同样的错误!我现在真的很难过.

jua*_*nza 5

DeleteArr必须提供声明FixedVector,即前者的定义必须在后者使用之前.这可能与MSVC无法正确实现两阶段查找有关.