[英]How to do `using` of weak enums in C++11?
我在標題中的類中有枚舉:
namespace A {
class B {
public:
enum Value {
VALUE1 = 1,
VALUE2 = 2,
};
};
}
我想在沒有前綴的源文件中使用它的值,如下所示:
#include "header"
int main() {
someFn(VALUE1);
return 0;
}
我試過using A::B::Value;
但是clang給出了一個錯誤:
使用聲明不能引用類成員
即使我在課堂外移動枚舉:
namespace A {
enum Value {
VALUE1 = 1,
VALUE2 = 2,
};
}
並using A::Value;
,錯誤消失了,但編譯器抱怨VALUE1
:
使用未聲明的標識符'VALUE1'
如果枚舉是在其他地方定義的,有沒有辦法使用沒有任何前綴的枚舉值? - 使用#define
s是#define
的。
如果沒有辦法,那么在C ++ Standard中實現這種行為可能會出現什么問題呢?
簡單來說就是:它是不可能的,因為枚舉是在類中定義的。
如果將class B
更改為namespace B
:
namespace A {
namespace B {
enum Value {
VALUE1 = 1,
VALUE2 = 2,
};
};
}
然后就可以了(就像你在代碼中寫的那樣):
using A::B::Value
您的方法失敗有兩個原因:
第一個原因已由BЈови描述:您不能在命名空間范圍中引入嵌套類型的名稱,請參閱[namespace.udecl] / 8。
using A::B::Value;
編寫時using A::B::Value;
,只有enum
本身的名稱將在當前范圍內引入, 而不是所有枚舉器的名稱。 這允許這樣的事情:
namespace Values { enum Value{ VALUE1, VALUE2 }; } using Values::Value; // don't pollute my scope with the enumerators Value v = Values::VALUE1;
第二個問題可以通過單獨介紹枚舉器來解決:
namespace A
{
namespace B
{
enum Value
{
VALUE1
, VALUE2
};
}
}
int main()
{
using A::B::Value;
using A::B::VALUE1;
using A::B::VALUE2;
Value v = VALUE1;
v = VALUE2;
}
或者,正如hvd 在注釋中建議的那樣 ,您可以使用using-directive來引入命名空間的所有名稱:
namespace A
{
namespace B
{
enum Value
{
VALUE1
, VALUE2
};
}
}
int main()
{
using namespace A::B;
Value v = VALUE1;
v = VALUE2;
}
枚舉的處理方式與類似。 將其視為嘗試執行以下操作:
class Value
{
public:
static const int VALUE1 = 0;
};
using Value::VALUE1; // ERROR class-qualified name
簡而言之:您不能using
語句以這種方式顯示枚舉值。
嗯,我能想到的最接近的是:
namespace A {
class B {
public:
enum Value { VALUE1 = 1, VALUE2 = 2 };
};
};
const A::B::Value VALUE1 = A::B::VALUE1;
int main () {
return VALUE1;
}
但它相當乏味和容易出錯,絕對不值得。 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.