VS2017报错:未提供初始值设定项

今天在使用VS2017写程序时,报错:

出错的代码如下:

#include "pch.h"
#include <iostream>
#include <thread>
using namespace std;

class TA
{
public:
	TA(int &i);
	~TA();
	//TA(const TA& ta);  //拷贝构造函数
	void operator()()
	{
		cout << "我的线程开始执行了" << endl;


		cout << "我的线程结束了" << endl;
	}
private:
	int &m_i;
};

TA::TA(int &i)
{
	this->m_i = i;
	cout << "TA的构造函数" << endl;
}

TA::~TA()
{
	cout << "TA的析构函数" << endl;
}
//
//TA::TA(const TA &ta)
//{
//	this->m_i = ta;
//}

int main()
{
	int i = 6;
	TA ta(i);
	thread mytobj(ta);
	mytobj.join();

	cout << "主线程执行结束" << endl;

	return 0;
}

在网上查找资料后找到原因:

可以初始化const对象或引用类型的对象,但不能对他们赋值。在开始执行构造函数的函数体之前,必须完成初始化。初始化const或引用类型数据成员的唯一机会是在构造函数初始化列表中。

也就是说在类TA中声明了引用m_i,只能在构造函数初始化列表中进行初始化。

将上面的代码修改如下后错误消失:

#include "pch.h"
#include <iostream>
#include <thread>
using namespace std;

class TA
{
public:
	TA(int &i) :m_i(i) {};
	~TA();
	//TA(const TA& ta);  //拷贝构造函数
	void operator()()
	{
		cout << "我的线程开始执行了" << endl;


		cout << "我的线程结束了" << endl;
	}
private:
	int &m_i;
};

TA::~TA()
{
	cout << "TA的析构函数" << endl;
}
//
//TA::TA(const TA &ta)
//{
//	this->m_i = ta;
//}

int main()
{
	int i = 6;
	TA ta(i);
	thread mytobj(ta);
	mytobj.join();

	cout << "主线程执行结束" << endl;

	return 0;
}
posted @ 2019-09-18 20:02  尚修能的技术博客  阅读(5184)  评论(0编辑  收藏  举报