PImpl с C : почему код не работает?

#c #pimpl-idiom

#c #pimpl-идиома

Вопрос:

Я решил проблему, поставив #include "stdafx.h" (это утверждение пропущено в исходном вопросе, извините за это) ПЕРЕД #include "PImplTest.h" , а не ПОСЛЕ него.

Но я все еще не понимаю, почему он не может остаться после него.

 // stdafx.h
#include <tinyxml2.h>
#include <queue>
#include <map>
#include <vector>
#include <list>
#include <set>
#include <stack>
#include <string>
#include <memory>
#include <assert.h>
  

———————— исходный вопрос ———————————

Я пытаюсь использовать шаблон PImpl в C . Файл заголовка:

 // PImplTest.h

#pragma once
#include <memory>

class PImpl
{
private:
    class Impl;
    std::unique_ptr<Impl> m_impl;
};
  

Что меня смущает, так это то, что если я реализую Impl класс в соответствующем cpp-файле заголовка следующим образом:

 // PImplTest.cpp
#include "PImplTest.h"
#include "stdafx.h" // this statement was missed in my first post

class PImpl::Impl // error C2079 'Impl' uses undefined class 'PImpl'
{ // error C2653 'PImpl':is not a class or namespace name
};

  
 // main.cpp
#include "stdafx.h" // this statement was missed in my first post
#include "PImplTest.h"

int main()
{
    return 0;
}
  

VS сообщает о 2 ошибках в комментариях к коду выше. Однако, если он реализован в файле, подобном этому:

 // main.cpp
#include "PImplTest.h"

class PImpl::Impl
{ 
};

int main()
{
    return 0;
}
  

Тогда ничего не пойдет не так.

В чем проблема? Как это исправить?

Комментарии:

1.Это единственные #include директивы, и, в частности, есть ли у вас другие заголовки, которые включают или включены PImplTest.h ?

2. нет, это весь код

3. Внимание: вам нужно будет добавить ~Pimpl(); в свой заголовок и Pimpl::~Pimpl() = defau< в свой cpp-файл, чтобы std::unique_ptr Impl по завершении был создан экземпляр деструктора.

4. Является ли сообщение об ошибке, которое вы цитируете, первым сообщением об ошибке, выводимым компилятором?

5. Я очень сожалею, что пропустил строку кода ПОСЛЕ «#include»PImplTest.h»» в файле PImplTest.cpp в первом случае это «#включить «stdafx.h»». Когда я помещаю его ПЕРЕД инструкцией include в PImplTest.h, все правильно. Но я все еще в замешательстве, почему включение pch должно оставаться перед включением PImplTest.h?