c++ - G++ 模板实例化导致 "Undefined reference to"错误

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

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

ma​​trixd.cpp

#include "matrixd.h"

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

矩阵d.h

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

    typedef _vec2<float> vec2;
}

测试.cpp

#include "matrixd.h"

int main()
{
    math::_vec2<float> v;
}

错误信息:

In function main': source.cpp:(.text+0x10): undefined reference to math::_vec2::_vec2()' collect2: error: ld returned 1 exit status

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

最佳答案

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

解决方法是交换两行:

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

关于c++ - G++ 模板实例化导致 "Undefined reference to"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30563012/

相关文章:

c++ - 模板别名在模板类模板方法的参数中不起作用

c++ - 为每个函数和自由函数 boost mpl

c++ - Makefile 和嵌套的头文件

c++ - 显示从索引 i 到字符串末尾的 std::string

c++ - boost::spirit 排列

c++ - 通过 SWIG 在 python 中使用 std::ifstream、std::ofstream 的技术?

c++ - 包装器是从 strcat_s() 到 strcat() 吗?如果没有,是否可以创建一个?

c++ - 不重复用作模板参数的类型

linux - 更新 openssl,现在链接错误与 NSSLOW_

c++ - 禁用特定包含文件的警告