这个简单的 C++ 模板类有啥问题?

Posted

技术标签:

【中文标题】这个简单的 C++ 模板类有啥问题?【英文标题】:What is wrong with this simple C++ template class?这个简单的 C++ 模板类有什么问题? 【发布时间】:2014-03-07 11:09:04 【问题描述】:

以下sn-p在头文件中:

// Represents NxN scalar values (aka square matrix).  
template<std::size_t N>
class dummy
 
    public:
    float& operator[](const std::size_t ind)  return scalars[ind]; 

    private:
    float scalars[N*N];
;

using dummy2 = dummy<2>;

这就是我将如何使用它:

// 2x2=4 floats
dummy2 d;

std::cout << d[0] << std::endl; // prints 0
std::cout << d[1] << std::endl; // prints 0
std::cout << d[2] << std::endl; // prints -1.42253e+19
std::cout << d[3] << std::endl; // prints 4.59163e-41

我的问题是为什么最后两次打印调用没有产生零值?

【问题讨论】:

你初始化标量了吗? 【参考方案1】:

您没有为您的类提供构造函数,因此编译器会生成一个默认构造函数,该构造函数会默认初始化该类的所有成员。并且默认初始化内置类型意味着它根本没有初始化,因此对其值的任何使用都是未定义的。换句话说,scalars 没有被初始化为任何东西。

你可以这样修复它:

template<std::size_t N>
class dummy
 
    public:
    float& operator[](const std::size_t ind)  return scalars[ind]; 

    dummy() : scalars()
    

    private:
    float scalars[N*N];
;

using dummy2 = dummy<2>;

这使得 scalars 值初始化而不是默认初始化,并且值初始化 float 将其设置为 0.f,所以一切都会工作。

Live example

【讨论】:

【参考方案2】:

scalars 未显式初始化。前两个零实际上是未定义行为的结果,因此您应该在构造函数中将数组设置为零。

【讨论】:

以上是关于这个简单的 C++ 模板类有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

类模板中的static关键字

java接口与抽象类有啥区别?

C++类模板中的static成员

C++ 为类模板提供初始化列表构造函数

这个c++程序无法执行,简单的类模板运用,我觉得没有问题哦。代码如下,求交流

这个简单的 OpenGL/JOGL 模板测试有啥问题?