C++ C++;
我正在写一个矩阵库。 我把我的类放在名称空间SLMath中。 但是由于内联函数,我得到了错误 这些是我的档案 Mat4.hppC++ 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
#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