Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.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 Studio - Fatal编程技术网

C++ 已声明但未定义的函数?但它是有定义的

C++ 已声明但未定义的函数?但它是有定义的,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;

标题.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> 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