我有一个模板类B
,它派生自模板类A
。
类A
有3个模板参数(以下是A.h
):
#ifndef A_HEADER
#define A_HEADER
#include "Eigen/Dense"
template<typename T = double, int xsize = Eigen::Dynamic, int ysize = Eigen::Dynamic>
class A {
public:
// Constructor, etc.
...
我们从课程B
派生的:
#ifndef B_HEADER
#define B_HEADER
#include "A.h"
#include "Eigen/Dense"
template<typename T= double, int ysize = Eigen::Dynamic>
class B : public A<T, 4, ysize> {
private:
Eigen::Matrix<T, ysize, 4> Hj = Eigen::Matrix<T, ysize, 4>::Identity(2, 4);
public:
// Constructor, etc.
...
然后在main函数中,我像这样实例化B
:
B<float> b(...
我希望获取模板默认值。当我尝试在Cygwin G ++中编译它时,我没有得到任何编译错误。但是,使用Ubuntu G ++,我收到了错误
/mnt/c/Dropbox/drive/kf/src/b.h:11:68: error: declaration of ‘Eigen::Matrix<T, ysize, 4> B<T, ysize>::ysize’
Eigen::Matrix<T, ysize, 4> Hj = Eigen::Matrix<T, ysize, 4>::Identity(2, 4);
^
/mnt/c/Dropbox/drive/kf/src/b.h:7:38: error: shadows template parm ‘int ysize’
template<typename T = double, int ysize = -1>
^
/mnt/c/Dropbox/drive/kf/src/b.h:11:75: error: expected unqualified-id before numeric constant
Eigen::Matrix<T, ysize, 4> Hj = Eigen::Matrix<T, ysize, 4>::Identity(2, 4);
^
/mnt/c/Dropbox/drive/kf/src/b.h:11:58: error: wrong number of template arguments (1, should be at least 3)
Eigen::Matrix<T, ysize, 4> Hj = Eigen::Matrix<T, ysize, 4>::Identity(2, 4);
^
这种模式有什么问题?
注意:将初始化移动到构造函数不会对我造成一点伤害。我只是不明白为什么Cygwin G ++编译器对此很好,但Ubuntu版本却没有。
编辑:从g++ --version
Windows Cygwin G++ : g++ (GCC) 6.4.0
Ubuntu G++ : g++ (Ubuntu 5.4.0-6ubuntu1~16.04.6) 5.4.0 20160609