C++ 已声明但未定义的函数?但它是有定义的
标题.hC++ 已声明但未定义的函数?但它是有定义的,c++,visual-studio,C++,Visual Studio,标题.h namespace VectorMath { static FVector Make(float X, float Y, float Z); } file.cpp namespace VectorMath { static FVector Make(float X, float Y, float Z) { FVector ret; ret.X = X; ret.Y = Y; ret.Z = Z;
namespace VectorMath {
static FVector Make(float X, float Y, float Z);
}
file.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行,它似乎与任何内容都没有任何关联
我想指出,删除“static”会给我链接器错误,告诉我“Make”是一个未解析的外部符号…你必须在定义中删除“static”,无论如何,这个函数没有理由是静态的。所以你也可以把它放在声明里
所以你可以这样写定义:
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;
}
}
干杯您需要删除
静态
,否则该函数在不同的编译单元中将不可见。只用
namespace VectorMath {
FVector Make(float X, float Y, float Z);
}
定义也是如此
如果这不能解决链接问题,您需要确保编译并正确链接file.cpp
,但是静态
肯定是错误的
关于您的评论,您发现了问题,即在使用
内联
-函数时无法将声明与定义分开:是的,这与方法的生成符号及其可见性具有类似的效果。我觉得奇怪的是,尽管您在问题中从未提及inline
,但您要求将此作为接受答案的先决条件。我怎么会知道你只是添加了一些你并不真正理解的随机关键词呢?这不是其他人帮助你解决问题的好基础。你需要发布真实的代码并对我们诚实。如果以后再问更多问题,请记住这一点。如果有帮助,代码可以在单个编译单元中工作
你的定义不一样。您在命名空间中声明了一个函数,在命名空间外定义了一个不同的函数。您是否在命名空间中实现了Make VectorMathI我确实将它们放在了同一个命名空间中,抱歉,更正了这个问题。请从声明和定义中删除
static
。对,正如我所指出的,每当我在另一个.cpp文件中引用VectorMath::Make时,删除static会给我带来无法解析的符号。你知道为什么吗?我必须使用一个静态类或其他东西,而不仅仅是名称空间中的函数吗?@答案中已经写到:没有static
代码本身就可以了。您需要确定项目的构建方式。因为我没有使用Visual Studio,所以我只能指出正确的方向:好吧,您需要将文件file.cpp
作为源添加到项目中-但可能需要询问VS用户…我向您保证,如果您创建了我问题中的两个文件,请将它们添加到MSVS中的解决方案中,删除静态关键字。然后创建第三个包含vectormath.h头的.cpp文件,然后尝试使用该名称空间中的函数之一,您将得到链接器错误。你还一直在说我是如何建立这个程序的。这是一个非常基本的dll构建,这里没有什么新奇或错误。我相信使用extern关键字实际上已经解决了我的问题,不过我想测试一下以确定。我只想将此标记为正确,然后发布一个单独的问题。我找到了链接器问题的解决方案。使用内联函数时,不能将声明与定义分开。如果你把这个包括在你的答案中,我会把它标记为正确的。那没有帮助。在单个编译单元中使用或不使用static
代码都可以,而在具有多个编译单元的项目中使用static
代码则错误,否则可以。看来OPs真正的问题在于他如何构建程序。
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