如何使命名空间中的[std :: operator"" s]可见?

时间:2017-01-03 13:01:49

标签: c++ c++11 namespaces visibility user-defined-literals

#include <chrono>

namespace X
{
using namespace std;
struct A
{
    std::chrono::seconds d = 0s; // ok
};
}

namespace Y
{
struct B
{
    std::chrono::seconds d = 0s; // error
};
}

错误消息是:

  

错误:没有匹配的文字运算符可以调用&#39;运算符&#34;&#34; s&#39;同   类型&#39; unsigned long long&#39;或者&#39; const char *&#39;,没有   匹配文字运算符模板             std :: chrono :: seconds d = 0s;

我的问题是:

我不想在use namespace std;namespace Y;那么,我应该如何在std::operator""s中看到namespace Y

2 个答案:

答案 0 :(得分:4)

如果您想拥有所有计时文字,那么您可以使用

using namespace std::chrono_literals;

如果您只想operator""s,那么您可以使用

using std::chrono_literals::operator""s;

请注意,至少在coliru gcc发出上述行的警告但是clang没有。对我来说应该没有警告。我在Should a using command issue a warning when using a reserved identifier?

询问了有关此问题的跟进问题

答案 1 :(得分:1)

tl; dr:使用

using namespace std::string_literals

这些运算符在命名空间std::literals::string_literals中声明,其中literalsstring_literals都是内联命名空间。可以使用using namespace std::literalsusing namespace std::string_literalsusing namespace std::literals::string_literals来访问这些运算符。

来源:https://en.cppreference.com/w/cpp/string/basic_string/operator%22%22s