6

我正在尝试将一些为 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() 的实现添加到我在模板上方声明它的位置。这似乎导致同样的错误!我现在真的很难过。

4

2 回答 2

8

的声明DeleteArr必须对 可用FixedVector,即前者的定义必须先于后者的使用。这可能与 MSVC 未能正确实现两阶段查找有关。

于 2012-09-26T10:12:51.440 回答
1

首先定义 DeleteArr

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

然后定义固定向量

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;
    }
// ...
}
于 2012-09-26T10:40:31.623 回答