模板化构造函数中的奇怪错误

Strange error in templated constructor

尝试在模板化构造函数中转换参数时出现奇怪的编译器错误。这是一个最小的例子:

#include <Eigen/Dense>

class Plane
{
public:
    template <typename TVector>
    Plane(const TVector& coefficients) {
        coefficients.cast<double>(); // compiler error on this line
    }

// This compiles fine
//    Plane(const Eigen::Vector3d& coefficients) {
//        coefficients.cast<double>();
//    }
};

int main(){return 0;}

错误是:

expected primary-expression before 'double'
expected ';' before 'double'

因为这个 class 从未被实例化(main() 是空的),我认为编译器根本不会看到函数模板,所以我很困惑如何这个表达式有错误吗?

您必须使用 template 关键字:

template <typename TVector>
Plane(const TVector& coefficients) {
    coefficients.template cast<double>();
}