如何引用子类内定义的枚举

时间:2016-04-26 12:30:17

标签: c++ namespaces

假设我有以下基类:

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”?我可以使用命名空间来做到这一点。但是,当枚举被定义为基类的一部分时,它可以完成吗?

2 个答案:

答案 0 :(得分:1)

允许引用First而不完全限定

  

有没有办法,通过添加"使用"允许我参考的声明   "首先"没有完全合格吗?

不,但enum可以按照自己的条件处理。

对于usingtypedef声明,我们必须使用类型。所以

  • 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;。这是为了公开命名空间作用域名称