enumで宣言を使用していますか?
-
22-07-2019 - |
質問
宣言の使用は列挙型では機能しないようです
class Sample{
public:
enum Colour { RED,BLUE,GREEN};
}
using Sample::Colour;
動作しません!! 列挙型の列挙子ごとにusing宣言を追加する必要がありますか?以下のように
using sample::Colour::RED;
解決
クラスは名前空間を定義しないため、<!> quot; using <!> quot;ここでは適用されません。
また、列挙型を公開する必要があります。
同じクラス内で列挙型を使用しようとしている場合の例を次に示します。
class Sample {
public:
enum Colour { RED, BLUE, GREEN };
void foo();
}
void Sample::foo() {
Colour foo = RED;
}
そして、クラスなしでアクセスするには:
void bar() {
Sample::Colour colour = Sample::RED;
}
他のヒント
Stevelaの回答に追加するには、元のコードの問題は、メンバーを参照しますが、using宣言自体はメンバー宣言ではありません:
7.3.3 / 6の機能:
クラスメンバーのusing宣言 メンバー宣言でなければなりません。
これを強調するために、次の例が機能します:
class Sample
{
public:
enum Colour { RED,BLUE,GREEN};
};
class Derived : public Sample
{
public:
using Sample::Colour; // OK
};
最後に、Igor Semenovが指摘したように、こちらネームスペースへの列挙定義により、using宣言を使用できます。using宣言は、enum型の名前のみをネームスペースに宣言します(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
}
依存ベースタイプ
部分的および明示的な特殊化を可能にするために、コンパイラはクラステンプレートを解析するときに、依存する基本クラスでルックアップを実行しません。その結果、サンプルをテンプレートとして使用した次のバリエーションはコンパイルされません。
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):
テンプレート宣言または定義で使用され、template-parameterに依存する名前は、該当する名前ルックアップがタイプ名を見つけるか、キーワードtypenameで修飾されていない限り、タイプに名前を付けないと想定されます。
名前がタイプであるための2つの条件を見る:
- 依存ベース
Colour
が検索されないため、Sample<T>
のルックアップはタイプを見つけません。 - 名前は
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;
}
};
注:標準の'98バージョンでは、using宣言で<=>を使用できなかったため、上記の修正は不可能でした。 依存ベースクラスからの型へのアクセスおよび CWG11 。
C ++標準、7.3.3.1:
で指定されたメンバー名 using-declarationは 宣言的な領域 using-declarationが表示されます。 [ 注意: 指定された名前のみがそうです 宣言された;列挙を指定する using宣言の名前は 列挙子を宣言します using-declaration <!>#8217; s宣言 領域。 <!>#8212;メモの終了]