如何从std :: list类禁用警告4510和4610?

时间:2009-06-01 13:37:54

标签: visual-c++ warnings

当我在课堂上使用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;
}

5 个答案:

答案 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
#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文件中的设置,我也可以通过为同一个文件指定编译属性来覆盖它们。那有什么不同?