【发布时间】:2016-06-19 23:08:52
【问题描述】:
我正在编写一个矩阵库。 我把我的类放在命名空间 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
和 Mat4.cpp..
#include"Mat4.hpp"
namespace SLMath
{
//private member functions
inline int Mat4::index(uint8 row,uint8 col) const
{
return row*4+col;
}
//Public member functions
Mat4::Mat4()
{
reset();
}
Mat4::Mat4(const Mat4 &other)
{
this->operator=(other);
}
Mat4::~Mat4(){}
inline float Mat4::operator()(uint8 row,uint8 col) const
{
return matrix[index(row,col)];
}
void Mat4::reset()
{
float identity[16] =
{
1.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,
0.0,0.0,1.0,0.0,
0.0,0.0,0.0,1.0
};
std::copy(identity,identity+16,this->matrix);
}
void Mat4::operator=(const Mat4 &other)
{
for(uint8 row=0 ; row<4 ; row++)
{
for(uint8 col=0 ; col<4 ; col++)
{
matrix[index(row,col)] = other(row,col);
}
}
}
inline const float* const Mat4::valuePtr()
{
return matrix;
}
}
但是当我这样做时..
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
当我从函数 valuePtr() 中删除 inline 关键字时,它工作正常。 请帮我... 这里还有一点不清楚的是,如果编译器为函数 valuePtr() 提供错误,那么它也应该为 operator()(uint8,uint8) 提供错误,因为它声明为内联?
【问题讨论】:
-
您发布的代码中没有任何内容可能导致此问题。我猜你的构建过程没有将你的可执行文件与编译后的翻译单元链接起来。
-
感谢您的回复.. 但是当我从函数 valuePtr() 中删除 inline 关键字时,它工作正常。
-
我们一般将内联函数放在表头中。并非所有编译器都足够聪明,可以从一个 .cpp 文件内联到另一个。或者只在更高的优化级别上这样做。
标签: c++ function linker namespaces