[解決済み] error: nononst static data member must be initialize out of line
質問
class Solution {
public:
static int m=INT_MIN; // it shows error: non-const static data member must
be initialized out of line.(why?)
using "int m=INT_MIN" is fine.
int func(TreeNode*root){
if(root==NULL){
return 0;
}
int l=max(func(root->left),0);
int r=max(func(root->right),0);
m=max(l+r+root->val,m);
return max(l,r)+root->val;
}
int maxPathSum(TreeNode* root) {
if(root==NULL)
{
return 0;
}
m=INT_MIN;
int x=func(root);
return m;
}
};
変数の値を更新する必要がある
m
. したがって、私は
static int
というデータ型があります。しかし、次のようなエラーが発生します。
使用している
int
の代わりに
static int
は正常に動作しています。しかし、なぜ
static int
がエラーになるのですか?
解決方法は?
Bjarne Stroustrupが解説しています。 こちら :
クラスは通常、ヘッダーファイルで宣言され、そのヘッダーファイルは は多くの翻訳ユニットに含まれるのが一般的です。しかし リンカのルールが複雑になるため、C++では、すべてのオブジェクトが一意であることが要求されます。 を定義しています。C++でクラス内定義が可能な場合、このルールは破られることになります。 オブジェクトとしてメモリに格納する必要があるエンティティを定義することができます。
Stroustrupが言ったように、すべてのクラスには固有の定義が必要です。さて、静的メンバはそのクラスと直接結びついていることはご存知の通りです。では、2つのケースを考えてみましょう。
-
その
static
メンバはまたconstant
なぜなら、コンパイラは独自の最適化を行い、このメンバの値が決して変化しないことが保証されているので、このメンバをコンパイル時の定数として扱うことができるからです。つまり、このメンバの値は固定されているので、このメンバが関連するクラスの定義も固定されているのです。だから、初期化はインラインで許されるのです。 -
は
static
メンバは一定ではありません。そして、その値はプログラムの実行中に後で変更される可能性があります。そのため、コンパイラはこのメンバに対してコンパイル時の最適化を行うことができない。したがって、クラスがロードされたときにこのようなメンバを初期化しようとするときに生じるかもしれない複雑さを防ぐために、このようなメンバのインライン初期化は許可されていません。
PS:
私も初めてこのコンセプトを聞いたときは、プログラマーが望む機能である直交性の原則に沿わないため、戸惑いました。直交性の原則とは、「直交性の原則に従えば、(1)(2)(3)(4)を組み合わせることができる。
int
と
static
と
int
と
const
と書くことができるはずです。
static const int
と
static int
と同じような形で。しかし、ここでのこのケースは、言語の開発者がコンパイルプロセスの単純化と引き換えに、言語のユーザーのために直交性をあきらめなければならない状況の一例と言えるでしょう。
直交性の概念を見てみよう こちら
関連
-
[解決済み] エラー: '...'のメンバー '...'が非クラス型である場合のリクエスト
-
[解決済み] テスト
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む