模版类中栈数组如何在初始化列表中初始化

NICK6918 2014-08-26 02:15:34
模版类中栈数组如何在初始化列表中初始化,代码如下:

template <typename T,int LENGTH>
class grid{
public:
grid():size(0),mcells({0}){};
private:
T mcells[LENGTH];
int size;
}


编译器报错:括号内的数组初始化列表是一个gnu extention,那么,怎样完成这个栈数组的初始化呢?

求各位大神解答。
...全文
467 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
winnuke 2014-08-29
  • 打赏
  • 举报
回复
默认构造吧,啥都别做。 就等编译器给个错误提示:xxx类型没有合适的构造函数。
mujiok2003 2014-08-28
  • 打赏
  • 举报
回复
引用 10 楼 NICK6918 的回复:
[quote=引用 6 楼 mujiok2003 的回复:] [quote=引用 5 楼 Saleayas 的回复:] [quote=引用 4 楼 taodm 的回复:] 需要使用C++11标准的新语法。 所以,要么T有正确的默认构造函数,要么,使用stl泛型算法fill。 memset什么的是作死的写法了。
请教一下,为什么 memset 是作死的写法? 作死在哪里。 我一直都是这样用的,一直没有觉得不好,请指点一下。谢谢[/quote] T 的布局可能不是标准布局(比如std::string)[/quote] +1,求解释标准布局,我也没弄清楚没什么memset不行。[/quote] 给你一个例子吧,自己捂一捂。
mujiok2003 2014-08-28
  • 打赏
  • 举报
回复
引用 9 楼 NICK6918 的回复:
[quote=引用 7 楼 mujiok2003 的回复:]

#include <array>
template <typename T,int LENGTH>
class grid{
public:
    grid():size(0))
{
    mcells.fill(T());
}
private:
    std::array<T, LENGTH> mcells;
    int size;
}
还想问一句,我们指定,对象会在进入构造函数之前对所有成员变量进行初始化,如果不在初始化列表里初始化数组,而是在构造函数内部无论时通过fill()也好还是自己遍历也好,这时对数组的操作是赋值还是初始化? 也就是说,如果不在初始化列表里初始化数组,编译器会自己先初始化数组么?[/quote] 如果数组元素类型有默认构造函数, 即使没有写在初始列表中,也会使用默认构造函数初始化的。 其他内置类型, 比如int, 则不会初始化。
NICK6918 2014-08-28
  • 打赏
  • 举报
回复
引用 6 楼 mujiok2003 的回复:
[quote=引用 5 楼 Saleayas 的回复:] [quote=引用 4 楼 taodm 的回复:] 需要使用C++11标准的新语法。 所以,要么T有正确的默认构造函数,要么,使用stl泛型算法fill。 memset什么的是作死的写法了。
请教一下,为什么 memset 是作死的写法? 作死在哪里。 我一直都是这样用的,一直没有觉得不好,请指点一下。谢谢[/quote] T 的布局可能不是标准布局(比如std::string)[/quote] +1,求解释标准布局,我也没弄清楚没什么memset不行。
NICK6918 2014-08-28
  • 打赏
  • 举报
回复
引用 7 楼 mujiok2003 的回复:

#include <array>
template <typename T,int LENGTH>
class grid{
public:
    grid():size(0))
{
    mcells.fill(T());
}
private:
    std::array<T, LENGTH> mcells;
    int size;
}
还想问一句,我们指定,对象会在进入构造函数之前对所有成员变量进行初始化,如果不在初始化列表里初始化数组,而是在构造函数内部无论时通过fill()也好还是自己遍历也好,这时对数组的操作是赋值还是初始化? 也就是说,如果不在初始化列表里初始化数组,编译器会自己先初始化数组么?
NICK6918 2014-08-28
  • 打赏
  • 举报
回复
还想问一句,我们指定,对象会在进入构造函数之前对所有成员变量进行初始化,如果不在初始化列表里初始化数组,而是在构造函数内部无论时通过fill()也好还是自己遍历也好,这时对数组的操作是赋值还是初始化? 也就是说,如果不在初始化列表里初始化数组,编译器会自己先初始化数组么?
mujiok2003 2014-08-27
  • 打赏
  • 举报
回复

#include <array>
template <typename T,int LENGTH>
class grid{
public:
    grid():size(0))
{
    mcells.fill(T());
}
private:
    std::array<T, LENGTH> mcells;
    int size;
}
mujiok2003 2014-08-27
  • 打赏
  • 举报
回复
引用 5 楼 Saleayas 的回复:
[quote=引用 4 楼 taodm 的回复:] 需要使用C++11标准的新语法。 所以,要么T有正确的默认构造函数,要么,使用stl泛型算法fill。 memset什么的是作死的写法了。
请教一下,为什么 memset 是作死的写法? 作死在哪里。 我一直都是这样用的,一直没有觉得不好,请指点一下。谢谢[/quote] T 的布局可能不是标准布局(比如std::string)
Saleayas 2014-08-27
  • 打赏
  • 举报
回复
引用 4 楼 taodm 的回复:
需要使用C++11标准的新语法。 所以,要么T有正确的默认构造函数,要么,使用stl泛型算法fill。 memset什么的是作死的写法了。
请教一下,为什么 memset 是作死的写法? 作死在哪里。 我一直都是这样用的,一直没有觉得不好,请指点一下。谢谢
taodm 2014-08-26
  • 打赏
  • 举报
回复
需要使用C++11标准的新语法。 所以,要么T有正确的默认构造函数,要么,使用stl泛型算法fill。 memset什么的是作死的写法了。
NICK6918 2014-08-26
  • 打赏
  • 举报
回复
引用 1 楼 Saleayas 的回复:
grid():size(0){ memset(&mcells, 0, sizeof(mcells);}
这样应该还是赋初值把?
敬畏者 2014-08-26
  • 打赏
  • 举报
回复
不支持,使用默认初始化就行了
Saleayas 2014-08-26
  • 打赏
  • 举报
回复
grid():size(0){ memset(&mcells, 0, sizeof(mcells);}

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧