在我正在编写的摇滚,纸张,剪刀程序中,我列举了三种不同的动作并将它们声明为一个类。但是,当我尝试编写using语句以便我必须避免使用范围运算符时,它似乎不起作用。谁知道为什么?
enum class choice {rock, paper, scissors};
using namespace choice;
这里出现一条错误消息,说:[错误]'choice'不是命名空间名称。 为什么是这样?在这种情况下,我认为选择可以是命名空间。
答案 0 :(得分:3)
您可以使用namespace choice { enum choice { ... }; }
实现所需的行为。它只适用于值,如果要声明变量,仍然必须使用choice::choice
。除非您当然也使用auto
。
答案 1 :(得分:3)
在C ++ 20中,P1099R5是可能的:
$this->set_directory( "user" );
$route['default_controller'] = 'home/index';
答案 2 :(得分:0)
choice
不是命名空间,因此using namespace choice;
无效。如果您不想使用范围指示符,请不要使用范围枚举。简单的枚举将适用于您目前所提到的内容:
enum choice { rock, paper, scissors };
答案 3 :(得分:0)
enum class choice {rock, paper, scissors}
rock = choice::rock, paper = choice::paper, scissors = choice::scissors;
答案 4 :(得分:0)
如果如下,我只使用" typedef A :: B :: C C"。
namespace A
{
class B
{
public:
enum class C : unsigned char
{
Something
};
};
}
答案 5 :(得分:0)
:/
namespace choice
{
enum class type {rock, paper, scissors};
constexpr auto rock = type::rock ;
constexpr auto paper = type::paper ;
constexpr auto scissors = type::scissors;
}
int main()
{
choice::type move;
using namespace choice;
move = rock;
move = paper;
move = scissors;
return 0;
}
-__-
答案 6 :(得分:0)
这可能是一个非常古老的问题,但是为了扩展@catscradle 的回答和@anton_rh 的评论,如果您添加一个“using”语句来为选择创建快捷方式,则可以使其更加方便::选择:< /p>
namespace choice_values {
enum type {
rock,
paper,
scissors
}
}
using choice = choice_values::type;
现在,您可以正常使用枚举:
choice chosen_move = choice::rock;
但如果您使用choice_values命名空间,您也可以避免使用范围运算符:
using namespace choice_values;
choice chosen_move = rock;
(我知道这作为评论可能更好,但我还没有这样做的声誉......)
答案 7 :(得分:0)
我会做一些类似于 Lut_99 的事情(但略有不同):
namespace choice_ns {
enum Choice { rock, paper, scissors };
}
using choice_ns::Choice;
bool beats(Choice a, Choice b) {
using namespace choice_ns;
switch (a) {
case rock:
// etc...
}
void does_not_compile() {
rock; // This requires qualification.
}
请注意,enum class
没有使用,但达到了类似的效果:在说 choice_ns::
时必须使用 rock
前缀。这样可以避免污染外部命名空间,这是 enum class
的要点。另请注意,与 enum class
一样,您可以在没有 Choice
前缀的情况下引用 choice_ns::
。
命名空间的名称故意笨拙,因为您唯一需要它的时候是您在函数开头说 using namespace ...
时。
这与 Lut_99 建议的不同之处在于,如果你按照他的方式去做,声明看起来像这样:
choice::type a;
与我的方式相比,这既冗长又笨拙:
Choice a;
其他一些建议涉及做
constexpr SomeType rock = whatever::rock;
但这真的不是很好,因为重复,这意味着你很有可能会犯错,特别是如果你决定稍后添加值。例如。 https://www.youtube.com/watch?v=Kov2G0GouBw
我一直想要这个。很高兴从 Baptistou 看到这将在不久的将来成为可能。与此同时,您可以使用目前可用的技术获得非常相似的东西。