G++ 模板实例化导致“未定义的引用”错误

1 c++ templates g++ undefined-reference

最近,我的自定义编写的通用矢量代码遇到了一些问题,该代码依赖于功能模板。我不愿意将实现包含在头文件中(这在模板中很常见),因为这会显着增加编译时间。因此,我在 .cpp 文件中手动实例化所需的类。然而,这仍然会导致未定义的参考错误。我已将代码缩减为以下代码片段,但仍然会生成错误:

矩阵d.cpp

#include "matrixd.h"

namespace math
{
    template class _vec2<float>;
    template<class T> _vec2<T>::_vec2() {}
}
Run Code Online (Sandbox Code Playgroud)

矩阵d.h

#pragma once
namespace math
{ 
    template <class T>
    class _vec2
    {
    public:
        T x, y;
        _vec2<T>();
        void reset();
    };

    typedef _vec2<float> vec2;
}
Run Code Online (Sandbox Code Playgroud)

测试.cpp

#include "matrixd.h"

int main()
{
    math::_vec2<float> v;
}
Run Code Online (Sandbox Code Playgroud)

错误信息:

在函数main': source.cpp:(.text+0x10): undefined reference to math::_vec2::_vec2()'collect2: 错误: ld 返回 1 退出状态

任何帮助,将不胜感激!:)

T.C*_*.C. 5

显式实例化定义(template class _vec2<float>;在代码中)仅实例化在显式实例化时定义的成员函数。_vec2<T>::_vec2()是在显式实例化定义之后定义的,因此不会显式实例化。

解决方法是交换两行:

namespace math
{
    template<class T> _vec2<T>::_vec2() {}
    template class _vec2<float>;
}
Run Code Online (Sandbox Code Playgroud)