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

时间:2015-05-31 21:42:34

标签: c++ templates g++ undefined-reference

我最近在使用自定义编写的通用矢量代码时遇到了一些问题,该代码依赖于模板的功能。我不愿意在头文件中包含实现(这与模板一样),因为这会大大增加编译时间。所以我在.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退出   状态

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

1 个答案:

答案 0 :(得分:4)

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

解决方法是交换两行:

namespace math
{
    template<class T> _vec2<T>::_vec2() {}
    template class _vec2<float>;
}