В C ++ вы / особенно / должны внимательно читать сообщения об ошибках компилятора.
Обратите внимание, что первой ошибкой было «ошибка:« A »не является именем пространства имен». Это правда, А это имя класса.
using namespace Foo; // brings in all of foo;
using Bar::Baz // brings in only Baz from Bar
Вы хотите написать:
using Test::A;
Это делает две хорошие вещи: он приносит вам А для использования, и он не приносит всей остальной части Теста, что тоже хорошо, потому что вы должны приносить только то, что вам нужно, чтобы не случайно зависеть от чего-то, от чего ты не понимаешь.
Однако, поскольку foo является статическим в A, вам все равно придется явно ссылаться на A :: foo. (Если вы не делаете что-то вроде написания бесплатной функции, которая пересылает A :: foo; в общем, это плохая идея, если вы делаете это только для того, чтобы сохранить некоторую типизацию.)
Некоторые могут посоветовать вообще не использовать объявления, а полностью указывать все имена.
Но это (цитируя Страуструпа) «утомительно и подвержено ошибкам», и это мешает рефакторингу: скажем, что вы полностью квалифицируете каждое использование класса FooMatic :: Stack, а затем руководство настаивает прямо перед вами » собирается начать производство, вы используете очень похожий класс стека BarMatic, потому что barMatic только что выкупили вашу компанию.
Если бы вы были повсюду полностью квалифицированы, вы бы много перепрыгивали, надеясь, что ваше регулярное выражение было правильным. Если вы использовали декларацию using, вы можете просто исправить свой (надеюсь, общий) заголовочный файл. Таким образом, объявление using очень похоже на «typedef int ourInt;» или манифест-константа или const: "const int FOO = 1;" в том смысле, что она предоставляет одно место для изменения того, что упоминается во многих местах. Полное определение пространства имен при каждом использовании лишает этой выгоды.
И наоборот, если бы вы использовали директиву using и внесли все пространство имен FooMatic, ваш grep мог бы быть еще сложнее, если, скажем, руководство настаивало на BarMatic :: Foo, но вы все равно должны были использовать FooMatic: Baz, эквивалент BarMatic для Баз по какой-то причине непригоден для использования.
Таким образом, ввод одного типа (класса, функции, константы) за один раз, как правило, является наиболее гибким способом наилучшей защиты от неизбежных, но пока неизвестных изменений. Как и в большинстве кодов, вы хотите минимизировать утомительное повторение при сохранении достаточной детализации.