使用GCC编译以下代码时,我遇到未定义的引用错误
通过以下命令在x86_64-suse-linux下使用4.7.2 20130108:

g++ main.cpp func.cpp -I/path/to/eigenlibrary/eigen_3.2.1

错误消息显示为:
     main.cpp:(.text+0x1d): undefined reference to `void f<2>(std::vector<Eigen::Matrix<double, 2, 2,
((Eigen::._84)0)|((((2)==(1))&&((2)!=(1)))?
    ((Eigen::._84)1) : ((((2)==(1))&&((2)!=(1)))?((Eigen::._84)0) : ((Eigen::._84)0))), 2, 2>,
     std::allocator<Eigen::Matrix<double, 2, 2, ((Eigen::._84)0)|((((2)==(1))&&((2)!=(1)))?
    ((Eigen::._84)1) : ((((2)==(1))&&((2)!=(1)))?((Eigen::._84)0) : ((Eigen::._84)0))), 2, 2> > >&)'

请注意,这与模板实现与头文件分开的事实无关,因为模板功能没有(通用)实现,而只是模板特化。模板特殊化的实现不能放入头文件中,因为这会产生多个定义错误。

另一个奇怪的事情是,如果我更改main.cpp中的前两个头文件包含项的顺序(本征/密度和 vector ),则不会发生错误。我对此一无所知,除“仅更改 header 包含的顺序然后”之外的任何帮助将不胜感激。

main.cpp:
#include <vector>
#include <Eigen/Dense>

//error does not occur once I change order of header inclusion like so:
//#include <Eigen/Dense>
//#include <vector>

#include "func.h"

int main() {
    std::vector<Eigen::Matrix<double, 2, 2> > m;
    f<2>(m);
}

func.h
#ifndef FUNC_H
#define FUNC_H

#include <Eigen/Dense>
#include <vector>

template <int N>
void f(std::vector<Eigen::Matrix<double, N, N> >& m);

template <> void f<2>(std::vector<Eigen::Matrix<double, 2, 2> >& m);

#endif

func.cpp
#include "func.h"
#include <vector>

template <>
void f<2>(std::vector<Eigen::Matrix<double, 2, 2> >& m) {}

最佳答案

func.h中,您的模板专门化声明应为:

template <> void f<2>(std::vector<Eigen::Matrix<double, 2, 2> >& m);

因此,就像在N=2中定义一样,在整个func.cpp中填充。

请注意,如果将func.h添加到定义中,则应该能够在inline中定义模板特化。

我可以在Arch Linux上使用GCC 4.6.4、4.7.4、4.8.2、4.9.0而不是Clang 3.4.2重现故障:
$ echo $'func.h\n---'; cat func.h; echo $'---\nfunc.c++\n---'; cat func.c++; echo $'---\nmain.c++\n---'; cat main.c++; g++-4.6 -I/usr/include/eigen3 main.c++ func.c++; ./a.out
func.h
---
#ifndef FUNC_H
#define FUNC_H

#include <Eigen/Dense>
#include <vector>

template <int N>
void f(std::vector<Eigen::Matrix<double, N, N> >& m);

template <> void f<2>(std::vector<Eigen::Matrix<double, 2, 2> >& m);

#endif
---
func.c++
---
#include "func.h"
#include <vector>

template <>
void f<2>(std::vector<Eigen::Matrix<double, 2, 2> >& m) {}
---
main.c++
---
#include <vector>
#include <Eigen/Dense>

//error does not occur once I change order of header inclusion like so:
//#include <Eigen/Dense>
//#include <vector>

#include "func.h"

int main() {
    std::vector<Eigen::Matrix<double, 2, 2> > m;
    f<2>(m);
}

我强烈建议您与Eigen开发人员联系。

关于c++ - 使用带有std::vector和特征矩阵的模板,来自GCC的未定义引用错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24730981/

10-11 23:08
查看更多