我在MyLiteral.h
中定义了以下用户定义的文字:
namespace my_literals {
constexpr uint64_t operator"" _nanoseconds(unsigned long long int value) {
return value*1000;
}
}
现在我可以在另一个标头SomeComponent.h
中使用运算符:
using namespace my_literals;
namespace foo {
constexpr uint64_t timeout = 10_nanoseconds;
}
但是,我不想用using namespace my_literals
来污染范围,因为这将为所有包含*.cpp
的{{1}}文件提供字面定义。
如何避免这种情况?在g ++中,SomeComponent.h
给出期望的unqualified-id之前的数字常量。
答案 0 :(得分:12)
在C ++ 17中,使用constexpr lambda,您可以这样做:
namespace foo {
constexpr uint64_t timeout = []{ using namespace my_literals; return 10_nanoseconds; }();
}
(C ++ 11及更高版本)的替代:
namespace foo {
constexpr uint64_t timeout = my_literals::operator""_nanoseconds(10);
}
或
namespace foo {
namespace detail
{
using namespace my_literals;
constexpr uint64_t timeout = 10_nanoseconds;
}
using detail::timeout;
}
答案 1 :(得分:5)
您可以通过显式调用运算符来解决此问题:
namespace foo {
constexpr uint64_t timeout = my_literals::operator""_nanoseconds(10);
}
答案 2 :(得分:0)
您可以将using
声明放入命名空间中(如果您不介意使用foo::operator""_nanoseconds
):
namespace foo {
using namespace my_literals;
constexpr uint64_t timeout = 10_nanoseconds;
}