函数已声明但未定义?然而,它是定义的

Function Declared But Not Defined? Yet It Is Defined

本文关键字:定义 然而 声明 未定义 函数      更新时间:2023-10-16

header.h

namespace VectorMath {
    static FVector Make(float X, float Y, float Z);
}

文件.cpp

namespace VectorMath {
    static FVector Make(float X, float Y, float Z)
    {
        FVector ret;
        ret.X = X;
        ret.Y = Y;
        ret.Z = Z;
        return ret;
    }
}

错误

1>c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xstring(541):错误 C2129:静态函数"FVector VectorMath::Make(float,float,float)"已声明但未定义 1> c:\programming****\vectormath.h(19):参见 'VectorMath::Make' 的声明

该错误将我指向 xstring(标准字符串库的一部分)第 541 行,它似乎与任何事情完全无关。

我想指出的是,删除"静态"会给我链接器错误,告诉我"Make"是一个未解析的外部符号......

您需要删除static,否则该函数在不同的编译单元中将不可见。只需使用

namespace VectorMath {
    FVector Make(float X, float Y, float Z);
}

定义也是如此。

如果这不能解决您的链接问题,您需要确保实际正确编译和链接file.cpp,但static肯定是错误的。


关于您发现问题的评论,即在使用 -functions 时无法将声明与定义分开inline:是的,这与生成的方法符号及其可见性具有类似的效果。我觉得奇怪的是,你要求以此作为接受答案的先决条件,尽管你从未在问题中提到inline。我怎么会知道你只是添加了你并不真正理解的随机关键字?这不是别人帮助你解决问题的好基础。您需要发布真实的代码并对我们诚实。如果将来提出更多问题,请记住这一点。

如果有帮助,代码在单个编译单元中工作

http://codepad.org/mHyB5nEl

namespace VectorMath {
class FVector{
public:
  float X;
  float Y;
  float Z;
void show (){
 std::cout<< "n t" <<X << "t "<< Y <<"t "<<Z;
}  
};  

static FVector Make(float X, float Y, float Z);
}
namespace VectorMath {
    static FVector Make(float X, float Y, float Z)
    {
        FVector ret;
        ret.X = (float)X;
        ret.Y = (float)Y;
        ret.Z = (float)Z;
        return ret;
    }
}

int main()
{
VectorMath::FVector result =  VectorMath :: Make(float(1.2) , float(2.2) ,float(4.2));
result.show();
}

输出:

1.2  2.2     4.2

您必须删除定义中的"静态",无论如何,此函数没有理由是静态的。因此,您也可以将其放在声明中。

所以你可以像这样写定义它:

FVector VectorMath::Make(float X, float Y, float Z)
{
    FVector ret;
    ret.X = X;
    ret.Y = Y;
    ret.Z = Z;
    return ret;
}

而这个:

namespace VectorMath
{
FVector Make(float X, float Y, float Z)
{
    FVector ret;
    ret.X = X;
    ret.Y = Y;
    ret.Z = Z;
    return ret;
}
}

干杯