C++ C++;

C++ C++;,c++,function,linker,namespaces,C++,Function,Linker,Namespaces,我正在写一个矩阵库。 我把我的类放在名称空间SLMath中。 但是由于内联函数,我得到了错误 这些是我的档案 Mat4.hpp #ifndef INC_SLMATH_MAT4_H #define INC_SLMATH_MAT4_H #include<cstdint> #include<algorithm> namespace SLMath { class Mat4 { typedef std::uint8_t uint8; // Yo

我正在写一个矩阵库。 我把我的类放在名称空间SLMath中。 但是由于内联函数,我得到了错误

这些是我的档案

Mat4.hpp

#ifndef INC_SLMATH_MAT4_H
#define INC_SLMATH_MAT4_H


#include<cstdint>
#include<algorithm>

namespace SLMath
{
    class Mat4
    {
        typedef std::uint8_t uint8; // You know that Its tedious to write          std::uint8_t everytime
        float matrix[16];
        inline int index(uint8 row,uint8 col) const;

    public:

        //Constructors
        Mat4();
        Mat4(const Mat4 &other);

        //Destructor
        ~Mat4();

    //operators
    void operator=(const Mat4 &other);

    //loads the identity matrix
    void reset();

    //returns the element in the given index
    inline float operator()(uint8 row,uint8 col) const;

    //returns the matrix array
    inline const float* const valuePtr();

};
}


#endif
在主函数中,它给了我一个链接错误

Main.obj : error LNK2019: unresolved external symbol "public: float const *    __thiscall SLMath::Mat4::valuePtr(void)" (?valuePtr@Mat4@SLMath@@QAEQBMXZ) referenced in function _main
当我从函数valuePtr()中删除inline关键字时,它工作得很好。 请帮帮我。。。
这里还有一点不清楚,如果编译器为函数valuePtr()给出错误,那么它也应该正确地为操作符()给出错误(uint8,uint8),因为它声明的内联?

在使用它的每个TU中都应该定义内联函数。这意味着您不能在头中放置声明,也不能在实现文件中定义函数

7.1.2/4
内联函数应在使用odr的每个翻译单元中定义,并且在每种情况下应具有完全相同的定义


应在使用内联函数的每个TU中定义内联函数。这意味着您不能在头中放置声明,也不能在实现文件中定义函数

7.1.2/4
内联函数应在使用odr的每个翻译单元中定义,并且在每种情况下应具有完全相同的定义


您发布的代码中没有任何内容会导致此问题。我猜您的构建过程没有将可执行文件与编译的翻译单元链接起来。谢谢您的回复。。但是,当我从函数valuePtr()中删除内联关键字时,它工作得很好。我们通常将内联函数放在标题中。并非所有编译器都足够聪明,可以从一个.cpp文件内联到另一个.cpp文件。或者只在更高的优化级别上这样做。你发布的代码中没有任何东西会导致这种情况。我猜您的构建过程没有将可执行文件与编译的翻译单元链接起来。谢谢您的回复。。但是,当我从函数valuePtr()中删除内联关键字时,它工作得很好。我们通常将内联函数放在标题中。并非所有编译器都足够聪明,可以从一个.cpp文件内联到另一个.cpp文件。或者只在更高的优化级别上这样做。谢谢你的回答。但是“inline float operator()(uint8,uint8)呢?我在头文件中声明了它,在其他.cpp文件中定义了它,并在主函数中使用了它,没有任何错误。@Ankitsingkushwah如果编译了某些东西,并不意味着它是正确的。由于违反此要求的程序不强制执行任何行为,您现在处于未定义行为的领域。它的一个可能结果是一切看起来都很完美。好吧,那么我将从函数中删除这些内联关键字。非常感谢您以及关于我的代码的任何其他建议?谢谢您的回答。但是“内联浮点运算符()(uint8,uint8)”呢?我在头文件中声明了它,在其他.cpp文件中定义了它,并在主函数中使用了它,没有任何错误。@Ankitsingkushwah如果编译了某些内容,并不意味着它是正确的。由于违反此要求的程序不强制执行任何行为,因此您现在处于未定义行为的领域。一个可能的结果是,一切看起来都很完美。好的,然后我将从函数中删除这些内联关键字。非常感谢,还有其他关于我的代码的建议吗?
SLMath::Mat4 matrix;
const float *const value = matrix.valuePtr();
Main.obj : error LNK2019: unresolved external symbol "public: float const *    __thiscall SLMath::Mat4::valuePtr(void)" (?valuePtr@Mat4@SLMath@@QAEQBMXZ) referenced in function _main