我最近在使用自定义编写的通用矢量代码时遇到了一些问题,该代码依赖于模板的功能。我不愿意在头文件中包含实现(这与模板一样),因为这会大大增加编译时间。所以我在.cpp文件中手动实例化了所需的类。但是,这仍然会导致未定义的引用错误。我已将代码缩减为以下代码段,但仍会生成错误:
matrixd.cpp
#include "matrixd.h"
namespace math
{
template class _vec2<float>;
template<class T> _vec2<T>::_vec2() {}
}
matrixd.h
#pragma once
namespace math
{
template <class T>
class _vec2
{
public:
T x, y;
_vec2<T>();
void reset();
};
typedef _vec2<float> vec2;
}
TEST.CPP
#include "matrixd.h"
int main()
{
math::_vec2<float> v;
}
错误讯息:
在函数
main': source.cpp:(.text+0x10): undefined reference to
math :: _ vec2 :: _ vec2()&#39; collect2:错误:ld返回1退出 状态
任何帮助将不胜感激! :)
答案 0 :(得分:4)
显式实例化定义(代码中的template class _vec2<float>;
)仅实例化在显式实例化时定义的成员函数。 _vec2<T>::_vec2()
是在显式实例化定义之后定义的,因此未明确实例化。
解决方法是交换两行:
namespace math
{
template<class T> _vec2<T>::_vec2() {}
template class _vec2<float>;
}