假设我有以下基类:
class LongComplexClassName
{
public:
enum Blar { First, Second, Third };
void useBlar() { doSomething( First ); } // works.
};
class MyClass : public LongComplexClassName
{
void useBlar() { doSomething( First ); } // error: wants LongComplexClassName::First
};
void nakedFunction()
{
doSomething( First ); // same error...
};
有没有办法,通过添加“使用”声明来允许我在没有完全限定的情况下引用“First”?我可以使用命名空间来做到这一点。但是,当枚举被定义为基类的一部分时,它可以完成吗?
答案 0 :(得分:1)
First
而不完全限定有没有办法,通过添加"使用"允许我参考的声明 "首先"没有完全合格吗?
不,但enum
可以按照自己的条件处理。
对于using
或typedef
声明,我们必须使用类型。所以
LongComplexClassName::Blar
将是一种类型,但LongComplexClassName::Blar::First
是一个值。First
而无需额外声明在以下程序中,我们可以将First
传递给doSomething()
。在课堂上我们不需要宣布任何东西。
#include <iostream>
#include <typeinfo>
template <typename T>
void doSomething(const T& t)
{
std::cout << typeid(t).name() << ":";
std::cout << t << '\n';
}
class LongComplexClassName {
public:
enum Blar { First,Second,Third };
void useBlar() { doSomething(First); } // Works. First is an enum value
};
class MyClass : public LongComplexClassName {
public:
void useBlar() { doSomething(First); } // Also works. First is still an enum value
};
int main()
{
LongComplexClassName{}.useBlar();
MyClass{}.useBlar();
return 0;
}
在我的系统上,这会产生:
enum LongComplexClassName::Blar:0
enum LongComplexClassName::Blar:0
First
接下来,对于该函数,如果我们接受LongComplexClassName::Blar::First
是一个值并相应地声明const
,那么我们就可以使用它。
#include <iostream>
#include <typeinfo>
template <typename T>
void doSomething(const T& t)
{
std::cout << typeid(t).name() << ":";
std::cout << t << '\n';
}
class LongComplexClassName {
public:
enum Blar { First,Second,Third };
void useBlar() { doSomething(First); } // Works. First is an enum value
};
class MyClass : public LongComplexClassName {
public:
void useBlar() { doSomething(First); } // Also works. First is still an enum value
};
void nakedFunction()
{
using Blar = LongComplexClassName::Blar;
const auto First = Blar::First;
doSomething(First); // Works. Now First is a const variable of an enum value and can be used
}
int main()
{
LongComplexClassName{}.useBlar();
MyClass{}.useBlar();
nakedFunction();
return 0;
}
在我的系统上,输出为:
enum LongComplexClassName::Blar:0
enum LongComplexClassName::Blar:0
enum LongComplexClassName::Blar:0
First
class enum
当然,我们也可以使用class enum
。然后,该程序需要在课程中const
允许使用First
而无需对其进行限定。
#include <iostream>
#include <typeinfo>
#include <type_traits>
template <typename T>
void doSomething(const T& t)
{
std::cout << typeid(t).name() << ":";
using ttype = std::underlying_type<T>::type;
std::cout << static_cast<ttype>(t) << '\n';
}
class LongComplexClassName {
public:
enum class Blar { First,Second,Third };
const LongComplexClassName::Blar First = Blar::First;
void useBlar() { doSomething(First); } // Works. First is a const variable of an enum value
};
class MyClass : public LongComplexClassName {
public:
void useBlar() { doSomething(First); } // Also works. First is a const variable of an enum value
};
void nakedFunction()
{
using Blar = LongComplexClassName::Blar;
const auto First = Blar::First;
doSomething(First); // Works. First is a const variable of an enum value and can be used
}
int main()
{
LongComplexClassName{}.useBlar();
MyClass{}.useBlar();
nakedFunction();
return 0;
}
在我的系统上,这会产生:
enum LongComplexClassName::Blar:0
enum LongComplexClassName::Blar:0
enum LongComplexClassName::Blar:0
答案 1 :(得分:0)
要回答您的问题,不,您不能使用&#34;使用&#34;。这是为了公开命名空间作用域名称