[解決済み] ネストされた名前指定子における不完全な型
2022-02-28 03:42:53
質問
以下のようにネストした名前指定子で不完全な型を使おうとしました。
class A;
int b= A::c; // error: incomplete type ‘A’ used in nested name specifier
class A {
static const int c=5;
};
N3797ワーキングドラフトの3.4.3/1には何も書かれていません。
<ブロッククオートクラスまたは名前空間のメンバまたは列挙子の名前を参照することができます。 を適用した後、::スコープ解決演算子(5.1)を適用する。 そのクラス、名前空間、またはそれを示す入れ子の名前指定子 列挙
では、その動作は実装依存なのでしょうか?
解決方法は?
はじめに
規格の中には、あなたのコードが不正確であることを暗に示唆する箇所がいくつかありますが、以下の引用文がそれを物語っています。
<ブロッククオート
3.3.2p6
宣言のポイント
[basic.scope.pdecl]
クラスのメンバを宣言した時点から、そのクラスのスコープでメンバ名を調べることができるようになります。
あなたのコードの問題は、不完全な型の内部に到達しようとすることではなく、クラスのメンバー名しか参照できないことです。 の後に が宣言されています。
この前方宣言では、(もちろん) c そのような名前を参照するのは不正な形式です。
誤解を招くような診断...
両者が発行する診断書 gcc と クラング というのは誤解を招きやすいので、正直なところ、バグレポートが必要だと感じています。
foo.cpp:3:8: error: incomplete type 'A' named in nested name specifier
私たち は で不完全な型を指定することができます。 ネストされた名前指定子 しかし、前述のように、まだ宣言されていないメンバーを参照することはできません。
不正な形式です。
class X {
static int a[X::x]; // ill-formed, `X::x` has not yet been declared
static int const x = 123;
};
を合法とする。
class X {
int const x = 123;
int a[X::x]; // legal, `X` is incomplete (since we are still defining it)
// but we can still refer to a _declared_ member of it
};
関連
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】Enterキーを押して続行する
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
-
[解決済み] 型名の後の括弧は、newで違いがあるのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】変数やフィールドがvoid宣言されている