Ответ 1
Не могли бы вы сделать typedef gee::whiz::abc::def::Hello Hello
?
Я понимаю проблемы, с которыми вы можете столкнуться, когда вы помещаете объявление using
внутри заголовочного файла, поэтому я не хочу этого делать. Вместо этого я попытался поместить using
(или namespace foo =
) в объявление класса, чтобы сократить повторную типизацию в файле заголовка. К сожалению, я получаю ошибки компилятора. Похоже, это была бы полезная функция.
#ifndef FOO_H
#define FOO_H
// This include defines types in namespace gee::whiz::abc::def,
// such as the class Hello.
#include "file_from_another_namespace.h"
// using namespace gee::whiz::abc::def; // BAD!
namespace x {
namespace y {
namespace z {
struct Foo {
using namespace gee::whiz::abc::def; // Illegal.
namespace other = gee::whiz::abc::def; // Illegal.
// Foo(gee::whiz::abc::def::Hello &hello); // annoyingly long-winded
Foo(other::Hello &hello); // better
//...
};
} } } // end x::y::z namespace
#endif // FOO_H
В реальном коде имена имен пространства намного дольше и раздражают, и это не то, что я могу изменить.
Может ли кто-нибудь объяснить, почему это не является законным или (лучше), если есть обходной путь?
Не могли бы вы сделать typedef gee::whiz::abc::def::Hello Hello
?
на самом деле не совсем ужасная идея. Это по крайней мере имеет такое же значение, как и то, как это работает сейчас (что дано, не так много). Я думаю, что основная проблема заключается в том, что классы не являются единицей компиляции и связывания, а "единицами перевода". Но делать это класс за классом гораздо чище, имея классы - модули, такие как Java или С# или другие языки, которые имеют больше смысла.
Имел ту же проблему, нашел этот вопрос. Я понял, что если вы оберните struct foo анонимным пространством имен, кажется, вы можете поместить
с использованием пространства имен тоже:: many:: names;
вверху анонимной обертки. Тем не менее, это уродливо, добавляя больше слоев вложенных брекетов.