8

头文件.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): error C2129: static function 'FVector VectorMath::Make(float,float,float)' 声明但未定义 1> c:\programming** * *\vectormath.h(19) : 见 'VectorMath::Make' 的声明

该错误将我指向 xstring (标准字符串库的一部分)第 541 行,这似乎与任何东西都没有关系。

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

4

3 回答 3

13

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

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

同样的定义。

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


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

于 2013-10-26T17:05:35.043 回答
1

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

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
于 2013-10-26T17:17:46.773 回答
-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;
}
}

干杯

于 2013-10-26T16:53:03.260 回答