我想我并不真正了解推荐背后的内容,我很乐意了解更多相关信息。
我正在编写一个数学“向量”类来进行数值模拟的基本线性代数。在我确信不再使用外部库之前,我正在使用Eigen。我的问题很简单:
Scalar
类型的组件(这些是双打)。我可以使用我的向量进行数学运算,因为我重载运算符,但这超出了我的问题的范围。myVector(0) = 0.0 ;
或Scalar d = myVector(0)+1.0 ;
根据我对参考文献的理解,这个解决方案应该有效:
class mtnVector {
public:
typedef double Scalar;
Scalar data [3];
(setters, math, etc...)
inline Scalar & operator() (const int i) const {
return data[i] ;
}
};
但是g ++说它不喜欢我实现它的方式并且确认我在引用时:
Vector.h:185: error: invalid initialization of reference of type ?double&? from expression of type ?const double?
从我的观点来看,非常奇怪的是,如果在类构造中动态设置包含数据的数组(Scalar * data
)(使用new运算符),则代码编译良好。但我没有看到动态设置数据持有者的重点。
我既不需要const来重载函数调用操作符,但我接受它。
答案 0 :(得分:2)
您的operator()
已宣布为const
。这意味着调用函数永远不应该最终修改对象。该函数通过非const
引用返回此对象的成员,这将允许任何调用operator()
的人修改对象的内部。显然这很傻,所以编译器不允许这样做。如果您要从const
成员函数返回对成员的引用,则需要提供该引用const
:
inline const Scalar& operator() (const int i) const {
return data[i] ;
}
您可能希望同时提供该函数的const
和非const
版本,其中一个返回const Scalar&
,另一个返回Scalar&
(这是how the standard library containers do it)。
您想要使用operator()
这似乎很奇怪。您的表达式myVector(0)
看起来更自然myVector[0]
,您可以通过重载operator[]
来实现这一点。
此外,你应该忽略任何说服你不要使用外部库的人。特别是,Eigen是一个非常成熟且经过全面测试的库。除非你有充分的理由,否则你应该使用它。