如何使用命名空间中定义的运算符?

csh*_*try 1 c++ namespaces operators literals

我在命名空间中定义了一个运算符,如下所示:

namespace Foo {
  class Bar {
    public:
      Bar(double val): baz(val) {}
    // Rest of my object here

    private:
      double baz;

  };

  namespace Qux {
    Bar operator ""
    _quux(long double opd) {
      return Bar(opd / 10);
    }
  }
}



int main() {
  using namespace Foo::Qux;
  std::cout << "100_quux" << std::endl;

}
Run Code Online (Sandbox Code Playgroud)

如何在不将Foo::Qux命名空间引入我的main()作用域的情况下使用运算符?

Nat*_*ica 10

您不能限定用户定义文字的命名空间,例如

std::cout << 100.0Foo::Qux::_quux << std::endl
Run Code Online (Sandbox Code Playgroud)

但是你可以做的是使用 using 语句将文字运算符导入mainusing

using Foo::Qux::operator""_quux;
Run Code Online (Sandbox Code Playgroud)

你会像这样使用它

std::cout << 100.0_quux << std::endl;
Run Code Online (Sandbox Code Playgroud)

您也可以手动呼叫接线员,例如

std::cout << Foo::Qux::operator""_quux(100.) << std::endl;
Run Code Online (Sandbox Code Playgroud)

另一种选择是将您的用户定义文字放入名为的命名空间中literals,然后您可以将其导入 main。那看起来像

namespace Foo {
  class Bar {
    public:
      Bar(double val): baz(val) {}
    // Rest of my object here

    private:
      double baz;

  };

  namespace Qux {
    inline namespace literals {
      Bar operator ""_quux(long double opd) {
        return Bar(opd / 10);
      }
    }
    // other Qux Members
  }
}



int main() {
  using namespace Foo::Qux::literals;
  std::cout << 100.0_quux << std::endl;

}
Run Code Online (Sandbox Code Playgroud)

请注意,文字是内联命名空间,因此Qux仍然可以访问成员而无需额外限定。