Разрешить std::string
к чему-то другому, чем ::std::string
- возможно ли это? [...]... в качестве альтернативы я рассматриваю возможность замены std::string
следующим образом ...
Насколько я знаю, это невозможно вне вашей анонимной области пространства имен потому что у вас нет способа разрешить неоднозначность (не в моих силах).
Как вы можете видеть ниже, поскольку вы находитесь внутри области анонимного пространства имен, все будет хорошо:
#include <string>
namespace
{
namespace std
{
struct string : public ::std::string
{
};
}
std::string hello; // Fine
}
int main()
{
std::string hello2; // Cannot be something else that ambiguous
return 0;
}
Но, что еще хуже, проблема не в самом std::string
, а в пространстве имен std
.
Действительно, вне области вашего анонимного пространства имен, каждый вызовstd
тоже становится двусмысленным. Это ошибка, указанная компилятором. Есть два std
пространства имен, доступных как есть из глобальной области.
Таким образом, следующий пример становится неработоспособным:
#include <string>
#include <vector>
namespace
{
namespace std
{
struct string : public ::std::string
{
};
}
std::string hello; // Fine
}
int main()
{
std::vector<int> a; // FAIL: reference to 'std' is ambiguous
return 0;
}
Чтобы исправить эту неоднозначность при доступе к исходному пространству имен std
,вам нужно будет написать это следующим образом:
::std::vector<int> a; // Fully qualified name: Only way to refer to the `::std` namespace
Как видите, это все еще не решает проблему и, что еще хуже, добавляет огромные неудобства.
Поэтому мораль такова:
- Не скрывайте уже существующий тип, а вместо этого создайте отдельный.
- Таким же образом, не скрывайте пространство имен (определяя одно и то же пространство имен в анонимное -> зло).
(I 'я открыт для любых предложений по улучшению этого ответа)