Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板定义可以';我找不到我的功能_C++_Visual C++_Scope_Clang - Fatal编程技术网

C++ 模板定义可以';我找不到我的功能

C++ 模板定义可以';我找不到我的功能,c++,visual-c++,scope,clang,C++,Visual C++,Scope,Clang,我正在尝试移植一些为MSVC编写的代码,以便在Clang上编译。然而,它似乎在寻找一些模板函数时遇到了问题。下面是给我带来问题的结构定义的一部分: template< typename T > struct FixedVector { T * ptr; size_t count; typedef T value_type; FixedVector():ptr(0),count(0) {} ~FixedVector() {

我正在尝试移植一些为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;
    }
// ...
}
这是我在指示行上收到的错误消息:

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中的一个怪癖,即在使用之前不需要定义这样的函数,只要在某个地方有定义。因此,我在中查找了此错误消息(相关部分的标题为“模板中的非限定查找”),它建议在模板定义之前添加一个转发声明。所以我在
FixedVector
的定义上面添加了这个:

template< typename T > inline void DeleteArr( T *& ptr );
templateinline void DeleteArr(T*&ptr);
但是,这个错误消息仍然会出现,并且错误消息的最后一位(“应该在调用站点之前声明”位)仍然指向函数的实际定义。有人知道可能是什么问题吗?我完全不知道这在MSVC上如何有效。另外,既然错误消息可以找到函数的定义,为什么会说找不到呢


更新:在评论的建议下,我将DeleteArr()的实现添加到模板上方声明的位置。这似乎会导致同样的错误!我现在真的被难住了。

必须对
FixedVector
提供
DeleteArr
的声明,即前者的定义必须在后者使用之前。这可能与MSVC未能正确实施的有关。

首先定义DeleteArr

template< typename T > inline void DeleteArr( T *& ptr )
    {
        delete[] ptr;
        ptr = NULL;
    }
模板内联void DeleteArr(T*&ptr)
{
删除[]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;
    }
// ...
}
模板结构固定向量
{
T*ptr;
大小/数量;
类型定义T值_类型;
FixedVector():ptr(0),count(0){}
~FixedVector()
{
DeleteArr(ptr);//此处显示错误消息
计数=0;
}
// ...
}

我有点困惑您的函数是否为成员函数。您不使用resolution操作符,因此我可能会认为它们是成员函数。但是为什么在定义它们时要使用
模板
内联
?DeleteArr不是FixedVector的成员:它是在用于实用程序函数的单独文件中声明的。最简单的修复方法似乎是将定义向上移动。但这并不能解释这种奇怪的行为。
DeleteArr
在同一名称空间中吗?它看起来像一个全局函数模板。此外,我不确定编译器是否能够根据模板推断出转发声明。即,它将尝试解决模板转发声明。我认为应该这样。我认为g++可以。您可以手工编写声明的实例化版本来检查它。@benwad:关于您的最后一条评论:如果它是在单独的文件中声明的,可能没有正确地包括在内。尝试在
FixedVector
之前声明它。我已经在FixedVector定义的正上方添加了DeleteArr定义,但仍然收到错误消息。还有其他原因吗?事实上,忽略最后的评论。有一个预处理器问题阻止我的定义被看到。
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;
    }
// ...
}