定数式でnumeric_limits :: max()を使用します
-
02-10-2019 - |
質問
クラス内の定数内で定義したいと思います。このようなもの:
class A
{
...
static const int ERROR_VALUE = std::numeric_limits<int>::max();
...
}
この宣言は、次のメッセージでコンパイルされていません。
numeric.cpp:8:error: 'std :: numeric_limits :: max()' 'nable-expression numeric.cpp:8:error:conster-expressionで関数呼び出しは表示できません
なぜこれがうまくいかないのか理解していますが、2つのことは私には奇妙に見えます。
私には、一定の表現で値を使用するという自然な決定のようです。なぜ言語デザイナーは作ることにしたのですか max() したがって、この使用を許可しない関数?
スペックは18.2.1で主張しています
numeric_limitsテンプレートで静的constを宣言したすべてのメンバーについて、専門分野は、これらの値を積分定数式として使用できるように定義するものとします。
シナリオでそれを使用できるはずであり、エラーメッセージと矛盾しないということではありませんか?
ありがとうございました。
解決
現在の標準にはここではサポートがありませんが、統合タイプについては boost.integertraits コンパイル時定数を提供します const_min
と const_max
.
問題はから発生します §9.4.2/4:
静的データメンバーがconst Integlalまたはconst列挙タイプの場合、クラス定義における宣言は、積分定数式(5.19)である定数イニサイザーを指定できます。その場合、メンバーは積分定数式で表示できます。
追加することに注意してください:
メンバーは、プログラムで使用され、名前空間スコープ定義に初期剤が含まれていない場合、名前スペーススコープで定義されます。
他の人がすでに述べたように numeric_limit
s min()
と max()
単に積分定数式ではなく、つまり時間定数をコンパイルします。
他のヒント
少し欠陥のように見えます...
C ++ 0xで、 numeric_limits
すべてがマークされています constexpr
, 、つまり、使用できることを意味します min()
と max()
コンパイル時定数として。
あなたが望む:
#include <limits>
struct A {
static const int ERROR_VALUE;
};
const int A::ERROR_VALUE = std::numeric_limits<int>::max();
クラス/構造体をヘッダーに入れ、定義を.cppファイルに入れます。
なぜなら、それは矛盾しません max
定義されてない static const
. 。これは単なる静的なメンバー関数です。関数はconstにすることはできず、静的メンバー関数も右側にconstを接続することはできません。
aもあります double max()
制限の二重バージョンで、C ++ 03では言うことはありません static double const max = ...
. 。一貫性を保つために、 max()
制限テンプレートのすべてのバージョンの関数です。
今、それは知られています max()
そのように使用できないことは悪いことであり、C ++ 0xはすでにそれを解決しています constexpr
機能、提案された使用を可能にします。
- 私はあなたの質問から理解したのと同じくらいあなたに答えようとします:
1-プログラム内の静的const intを関数で初期化する場合:
int Data()
{
return rand();
}
class A
{
public :
static const int ee;
};
const int A::ee=Data();
これはVS 2008で機能します
2-指定されたデータ型の最大数と最小番号を取得する場合は、これらの定義int_max、int_min、long_maxなどを使用します。
3-ただし、これらのWRTテンプレートタイプを使用する必要がある場合は、テンプレートを自分でハードコードします
template<>
int MaxData()
{
return INT_MAX;
}
と
template<>
long MaxData()
{
return LONG_MAX ;
}
そして、このように呼びます
int y=MaxData<int>();
4-そして、あなたがバイナリ表現されたタイプのみを扱っている場合、これを使用してください。
template <class T>
T MaxData(){
return ~(1<<((sizeof(T)*8)-1));
}
この
template <class T>
T MinData(){
return (1<<((sizeof(T)*8)-1));
}
これがあなたを助けることができることを願っています。