header.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;
return ret;
}
}
错误
1> c:\ program files(x86)\ microsoft visual studio 10.0 \ vc \ include \ xstring(541):错误C2129:静态函数'FVector VectorMath :: Make(float,float,float)'声明但未声明定义 1 GT; c:\ programming ** * * \ vectormath.h(19):参见'VectorMath :: Make'的声明
错误指向xstring(标准字符串库的一部分)第541行,它似乎与任何东西都毫无关联。
我想请注意,删除“静态”会给我链接器错误,告诉我“Make”是一个未解析的外部符号......
答案 0 :(得分:11)
您需要删除static
,否则该函数将在不同的编译单元中不可见。只需使用
namespace VectorMath {
FVector Make(float X, float Y, float Z);
}
同样的定义。
如果这不能解决您的链接问题,则需要确保实际编译并正确链接file.cpp
,但static
肯定是错误的。
关于您发现问题的评论,即使用inline
时无法将声明与定义分开 - 函数:是,这与生成的方法符号具有类似的效果,它的知名度。我觉得奇怪的是,你要求这是接受答案的前提条件,尽管你在问题中从未提及过inline
。我怎么会知道你只是添加了你不太懂的随机关键词?这不是帮助您解决问题的其他人的良好基础。您需要发布真实的代码并对我们诚实。如果将来再提出更多问题,请记住这一点。
答案 1 :(得分:1)
如果有帮助,代码在单个编译单元中工作
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
答案 2 :(得分:-2)
你必须在定义中删除“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;
}
}
干杯