gpt4 book ai didi

c++ - 带有枚举的 'using' 声明

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:03:16 26 4
gpt4 key购买 nike

using 声明似乎不适用于枚举类型:

class Sample{
public:
enum Colour {RED, BLUE, GREEN};
}

using Sample::Colour;

不起作用!

我们是否需要为枚举类型的每个枚举器添加一个using 声明?如下所示:

using sample::Colour::RED;

最佳答案

添加到 Steve Lacey's answer , 原始代码的问题是你引用了一个成员,但是 using 声明本身并不是一个成员声明:

7.3.3/6 有:

A using-declaration for a class membershall be a member-declaration.

为了强调这一点,以下示例确实有效:

class Sample
{
public:
enum Colour { RED,BLUE,GREEN};
};

class Derived : public Sample
{
public:
using Sample::Colour; // OK
};

最后,作为pointed out by Igor Semenov ,即使您将枚举定义移动到命名空间中,从而允许 using 声明,using 声明也只会将枚举类型的名称声明到命名空间中(2003标准引用是 7.3.3/2)。

namespace Sample
{
enum Colour { RED,BLUE,GREEN};
}

using Sample::Colour;
using Sample::BLUE;


void foo ()
{
int j = BLUE; // OK
int i = RED; // ERROR
}

依赖基类型

当编译器解析类模板时,允许部分和显式特化。它不在依赖基类中执行任何查找。因此,以下以 Sample 作为模板的变体无法编译:

template <typename T>
class Sample
{
public:
enum Colour { RED,BLUE,GREEN};
};

template <typename T>
class Derived : public Sample<T>
{
public:
using Sample<T>::Colour; // What kind of entity is Colour?

Colour foo () // Not OK!
{
return this->RED;
}
};

问题是 Derived::Colour被编译器 (14.6/2) 视为对象:

A name used in a template declaration or definition and that is dependent on a template-parameter is assumed not to name a type unless the applicable name lookup finds a type name or the name is qualified by the keyword typename.

查看名称为类型的两个条件:

  1. 查找 Colour找不到类型,因为依赖基 Sample<T>未被搜索。
  2. 名称未被 typename 限定

因此该示例需要 typename关键词:

template <typename T>
class Derived : public Sample<T>
{
public:
using typename Sample<T>::Colour; // Colour is treated as a typedef-name

Colour foo () // OK
{
return this->RED;
}
};

注意: 1998 版标准不允许 typename与 using 声明一起使用,因此无法进行上述修复。参见 Accessing types from dependent base classes CWG11 .

关于c++ - 带有枚举的 'using' 声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/438192/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com