读书人

构造函数咋这么定义

发布时间: 2012-11-07 09:56:10 作者: rapoo

构造函数咋这样定义?

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楼讲到了
[解决办法]
模板只是对宏的一种扩展,对编译器来说,实际上只是做了一些文本替换和插入工作而已。
[解决办法]
是的。。。。不错回答。。

读书人网 >C++

热点推荐