当我在课堂上使用std :: list时,我有一堆警告C4510和C4610。这是一个警告,指出默认构造函数不可用,我想禁用它们。
我放的时候:
#pragma warning(disable: 4510)
在实例化此列表的.cpp文件中没有任何反应。
我尝试将此pragma放在我实例化列表的函数周围,甚至在.cpp文件之上,但结果是一样的 - 没有任何反应。它仅在我在.cpp文件的属性对话框中禁用警告时才有效。我讨厌在这样的属性中隐藏东西,因为它们被开发人员忽视了。我想让它们围绕这个功能进行本地化。我能做点什么吗?
编辑:
确定。这就是我的代码基本上是这样的。此代码在警告级别4上生成警告4510和4610:
#include <list>
class foo {
public:
foo(int) { }
};
class bar {};
class problem_class {
foo m_foo;
const bar *m_bar;
public:
problem_class(const foo &_foo, const bar *_bar) : m_foo(_foo), m_bar(_bar) { }
};
void problem_fn(std::list<problem_class> &problem_collection) {
foo _foo(3);
problem_collection.clear();
problem_collection.push_back(problem_class(_foo, new bar));
}
int main(int , char **)
{
std::list<problem_class> collection;
problem_fn(collection);
return 0;
}
答案 0 :(得分:1)
不是通过禁用警告来隐藏问题,而是如何在具有默认构造函数*的代理类中使用默认构造函数来包装类。然后,代理的默认构造函数可以对包装类进行正确的初始化。然后将代理类存储在std :: list中。这将使您的意图明确并消除警告。
*假设您无论出于何种原因实际上使包装类具有适当的默认构造函数。
答案 1 :(得分:1)
您需要发布一些代码,说明您正在做什么。警告C4510说:
编译器无法生成默认值 指定类的构造函数 而且没有用户定义的构造函数 创建。你将无法做到 创建这种类型的对象。
这似乎与std :: list没有任何关系,所以可能是你的代码有问题。
我知道这不是很有帮助,但是你发布的代码看起来很好,编译时没有g ++和comeau的警告。我不再使用VC ++了,所以不能再进一步帮助了,我很害怕。
进一步编辑:纯粹本着实验的精神,如果你改变会发生什么:
const bar *m_bar;
到
bar *m_bar;
此警告的MSDN文档说:
有几种情况 阻止编译器生成 默认构造函数,包括:
* A const data member.
现在m_bar成员不是const(它指向的是它),但我想知道编译器是否对此有点困惑。
答案 2 :(得分:1)
在包含<list>
#pragma warning (disable:4510)
#pragma warning (disable:4610)
#include <list>
答案 3 :(得分:1)
#pragma warning (disable : 4510 4610)
#pragma warning (push, 3)
#include <list>
#pragma warning (pop)
#pragma warning (default : 4510 4610)
答案 4 :(得分:1)
好的,找到了。
我的项目使用预编译的头文件,因此在StdAfx.h中包含的某个头文件中有人包含列表。当我在StdAfx.h上添加#pragma指令时,一切正常。令我感到困惑的是,当我在
前面的.cpp文件中添加#pragma时#include "StdAfx.h"
什么都没有用(警告仍然显示)。由于列表包含在预编译头文件中,因此无论稍后指定的.cpp文件是什么,它都具有相同的警告设置。
但是,奇怪的是,即使我无法覆盖.cpp文件中的设置,我也可以通过为同一个文件指定编译属性来覆盖它们。那有什么不同?