Я столкнулся с удивительным открытием при реализации идиомы pimpl с классом самодельных указателей (я знаю: зачем кататься самостоятельно, но терпеть меня).Следующие три файла содержат минимальный пример:
Pointer.h:
#pragma once
template <typename T>
class Pointer
{
public:
Pointer(T*p=0)
: _p(p)
{
}
virtual ~Pointer()
{
delete _p;
}
private:
void operator=(const Pointer&);
Pointer(const Pointer&);
private:
T*_p;
};
Foo.h:
#pragma once
#include "Pointer.h"
struct Foo
{
Foo();
~Foo();
private:
void operator=(const Foo&);
Foo(const Foo&);
private:
Pointer<struct FooPrivate> p;
};
main.cpp:
#include "Foo.h"
int main(int argc, char* argv[])
{
Foo foo;
return 0;
}
Не берите в голову, как выглядят внутренности Foo.cpp
.Когда я компилирую main.cpp
с MSVC 2008, я получаю предупреждение:
pointer.h(13) : warning C4150: deletion of pointer to incomplete type 'FooPrivate'; no destructor called
Предупреждение можно избежать, удалив ключевое слово virtual из деструктора Pointers.
Это не имеет смысла для меня,Это предупреждение допустимо, или это ошибка в компиляторе MSVC?Если да, могу ли я спокойно проигнорировать предупреждение?
Я знаю, что в этом случае нет смысла превращать деструктор в виртуальный, но помните, это всего лишь минимальный компилируемый пример.Мой оригинальный код намного сложнее.