Как отключить предупреждения 4510 и 4610 из класса std :: list? - PullRequest
0 голосов
/ 01 июня 2009

У меня есть куча предупреждений C4510 и C4610, когда я использую std :: list со своим классом. Это предупреждение о том, что конструктор по умолчанию недоступен, и я хочу их отключить.

Когда я ставлю:

#pragma warning(disable: 4510)

внутри .cpp файла, который создает этот список, ничего не происходит.

Я пытался разместить эту прагму вокруг функции, где я создаю экземпляры списков и даже поверх файла .cpp, но результаты совпадают - ничего не происходит. Это работает, только если я отключаю предупреждения в диалоге свойств файла .cpp. Я ненавижу прятать такие свойства, потому что они игнорируются разработчиками. Я хотел бы, чтобы они были локализованы вокруг функции. Могу ли я что-нибудь сделать с этим?


EDIT:

Хорошо. Так выглядит мой код. Этот код генерирует предупреждения 4510 и 4610 на уровне предупреждения 4:

#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 ]

1 голос
/ 01 июня 2009

Хорошо, нашел его.

Мой проект использует предварительно скомпилированные заголовки, поэтому в каком-то заголовочном файле, который включен из StdAfx.h, кто-то включил в список. Когда я добавил директивы #pragma поверх StdAfx.h, все работало. Меня смутило то, что когда я добавил #pragma в файл .cpp перед

#include "StdAfx.h"

ничего не получалось (предупреждения все еще отображались). Поскольку список был включен в предварительно скомпилированные заголовки, у него были одинаковые настройки предупреждений независимо от того, какой файл .cpp был указан позже.

Но странно то, что даже если бы я не мог переопределить настройки в файле .cpp, я мог бы переопределить их, указав свойства компиляции для того же файла. Чем это отличается?

1 голос
/ 01 июня 2009
#pragma warning (disable : 4510 4610)
#pragma warning (push, 3)
#include <list>
#pragma warning (pop)
#pragma warning (default : 4510 4610)
1 голос
/ 01 июня 2009

Вам нужно опубликовать код, который точно иллюстрирует, что вы делаете. Предупреждение C4510 говорит:

Компилятор не может сгенерировать значение по умолчанию конструктор для указанного класса и пользовательский конструктор не был создано. Вы не сможете создавать объекты этого типа.

Похоже, это не имеет никакого отношения к std :: list, так что, возможно, что-то не так с вашим кодом.

Я знаю, что это не очень полезно, но код, который вы разместили, выглядит хорошо для меня и скомпилирован без предупреждений с g ++ и comeau. Я больше не использую VC ++, поэтому, боюсь, больше не поможет.

Дальнейшее редактирование: Чисто в духе экспериментов, что произойдет, если вы измените:

const bar *m_bar;

до

bar *m_bar;

Документы MSDN для этого предупреждения говорят, что:

Есть несколько ситуаций, которые предотвратить компилятор от генерации конструктор по умолчанию, в том числе:

* A const data member.

Теперь член m_bar не является константой (на что он указывает), но мне интересно, немного ли смущен компилятор по этому поводу.

1 голос
/ 01 июня 2009

Включить #pragma перед включением <list>

#pragma warning (disable:4510)
#pragma warning (disable:4610)
#include <list>
1 голос
/ 01 июня 2009

Вместо того, чтобы скрывать проблему путем отключения предупреждений, как насчет упаковки вашего класса без конструктора по умолчанию в прокси-класс, который имеет конструктор по умолчанию * Конструктор прокси по умолчанию может затем выполнить правильную инициализацию обернутого класса. Затем сохраните прокси-класс в std :: list. Это прояснит ваше намерение и устранит предупреждение.

* при условии, что вы не можете по какой-то причине фактически заставить обернутый класс иметь соответствующий конструктор по умолчанию.

...