构造函数咋这样定义?
- C/C++ code
template <typename T> explicit Point (const VecExpr<T> & expr) { for (int i = 0; i < D; i++) x[i] = expr(i); }
如上面所示的一段代码,这里是要定义一个构造函数,但为什么前面还要加上一个类模板定义的形式呢?实在是不懂。
[解决办法]
这只是代码的一小部分吧?
之所以有这个需求,应该是VecExpr本身需要模板参数,所以需要这么写。最好把更多的代码放上来
[解决办法]
假设:
class Point
{
template <typename T>
explicit Point (const VecExpr<T> & expr)
{
for (int i = 0; i < D; i++) x[i] = expr(i);
}
double x[D];
};
VecExpr<int> a = {10, ...};
VecExpr<double> b = {...};
Point p1(a);
Point p2(a);
都可以构造Point,而不是只能限定为VecExpr<double>
[解决办法]
嗯,这个确实是之前所说的,因为VecExpr是模板类,所以你的构造函数必须这么写。而且一旦你这么写了,
Point p1(a);
Point p2(b);
之所以能够执行,是因为它是模板啊!虽然你只写了一份构造函数,但因为参数类型不一样(两种),所以编译器会为你构造两个构造函数,所以你的代码就相当于变成了:
- C/C++ code
class Point{ explicit Point (const VecExpr<double> & expr) { for (int i = 0; i < D; i++) x[i] = expr(i); } explicit Point (const VecExpr<int> & expr) { for (int i = 0; i < D; i++) x[i] = expr(i); } double x[D];};
[解决办法]
如果你想限制一下,仅提供一个构造函数,则应明确写出VecExpr的模板参数类型例如
explicit Point( const VecExpr<int> expr)....
又或者你不想放弃VecExpr所提供的模板特性,那么就应该将模板声明放到类前面去:
- C/C++ code
template <class T>class Point{ explicit Point (const VecExpr<T> & expr) { for (int i = 0; i < D; i++) x[i] = expr(i); } T x[D];};
[解决办法]
这~怎么会不是构造函数呢~所谓的构造函数指的是,方法没有返回值,且其名称与类别一致的方法。可以没有参数(默认构造函数),也可以拥有多个参数,以对对象进行初始化。
所以~这确实是构造函数,只是你必须这么用:
VecExpr<int> a = {10, ...};
Point<int> p(a);
VecExpr<double> b = {....};
Point<double> p2(b);
对于上面来说,Point<int>和Point<double>是完全不相干的两个类型
[解决办法]
[解决办法]
3楼,4楼讲到了
[解决办法]
模板只是对宏的一种扩展,对编译器来说,实际上只是做了一些文本替换和插入工作而已。
[解决办法]
是的。。。。不错回答。。