Как включить два разных заголовка, которые содержат два разных класса с одинаковыми именами?
Я делаю некоторые изменения в старом приложении MFC. Заголовок "stdafx.h" включает в себя другой заголовок "mfcextensions.h", который определяет класс "CMemDC". В другом заголовке мне нужно включить "afxtoolbar.h", чтобы я мог использовать класс "CMFCToolBar". Проблема в том, что "afxtoolbar.h" будет в конечном итоге включать "memdc.h", который определяет класс "CmemDC". В результате понятно, что получить ошибку компиляции 2011 года.
Теперь у меня есть контроль над нашим существующим кодом, который определяет "CMemDC", но он используется во многих местах, поэтому я бы не стал слишком сильно его менять.
Какова лучшая стратегия для преодоления этого? Я предполагаю, что я мог бы каким-то образом использовать пространства имен, или другой альтернативой является переименование существующего класса в "CMemDC", но это скорее устраняет проблему, чем решает ее навсегда.
ура
3 ответа
Использование пространств имен - правильный путь, но вы, вероятно, также захотите узнать, почему CMemDC объявляется во всем приложении. Если вам действительно не нужно, чтобы ваш CMemDC был объявлен повсюду, вы можете избежать удаления include из stdafx.h и просто включения в файлы cpp, которые действительно в этом нуждаются.
Пространства имен C++ могут вам помочь. Поместите хотя бы один из классов CMemDC в подходящее пространство имен и используйте их полностью определенные имена там, где вы хотите использовать каждый из них.
Вы можете избежать использования полностью определенных имен и сделать использование пространства имен глобальным в текущей области с помощью
using namespace yournamespacename;
Однако это менее явно (с точки зрения невозможности непосредственно увидеть, какой CMemDC вы используете в одной точке кода), и в случае, если вы используете оба класса в одной и той же области, это не будет работать.
Если у вас есть 2 класса с одинаковыми именами, лучше всего использовать пространства имен. Также вы можете переименовать свой класс. Но все это уже есть в вашем посте. Итак, вы сами ответили на вопрос. Нет волшебства, которое может помочь вам, потому что вы застряли с обычной проблемой столкновения имен, и для решения таких проблем были введены пространства имен.