C ++は:int型への二重*からをstatic_castすることはできません*
-
20-09-2019 - |
質問
私がint *にダブル*をキャストするためにはstatic_castを使用しようとすると、私は次のエラーを取得する:
invalid static_cast from type ‘double*’ to type ‘int*’
ここでのコードは次のとおりです。
#include <iostream>
int main()
{
double* p = new double(2);
int* r;
r=static_cast<int*>(p);
std::cout << *r << std::endl;
}
私は、ダブル、int型の間の変換の問題があるだろうということを理解し、なぜダブル*とint型*?
との間の変換問題があります解決
別にいるのポインタ、double*
とint*
から共通点は何もありません。あなたは、任意の非類似の構造にFoo*
とBar*
ポインタ型についても同じことを言うことができます。
static_cast
手段
他のヒント
あなたはすなわち、ポインタをキャストするためにreinterpret_cast
を使用する必要があります。
r = reinterpret_cast<int*>(p);
もちろん、これは意味をなさない、
あなたはint
でdouble
レベル見てみたいしない限り!あなたは、いくつかの奇妙な出力を得るでしょうし、私はこれがあなたの意図したものではないと思います。あなたがp
への値のint
で指さをキャストしたい場合は、
*r = static_cast<int>(*p);
あなたは、次のいずれかを行うことができますので、また、r
はを割り当てられたのではありません。
int *r = new int(0);
*r = static_cast<int>(*p);
std::cout << *r << std::endl;
または
int r = 0;
r = static_cast<int>(*p);
std::cout << r << std::endl;
int a = static_cast<int>(5.2)
が微細であるので、浮動小数点整数への変換は、サポートされています。しかし、それは転換だ - 基本となるデータ型は、完全に互換性がありません。何しているの提示は、それがどんな意味のある方法で行うことができない4バイトの構造体へのポインタに8バイトの構造体へのポインタを変換するためのランタイム用です。
あったこと、あなたが本当に整数として、あなたのダブルを解釈するようにしたい場合は、int* r = reinterpret_cast<int*>(p)
は罰金に動作します、と述べています。
あなたは異なった型へのポインタとの間に二重とstatic_cast<>
とint型ではなく、間を変換することができます。あなたはvoid *
でstatic_cast<>
にまたはから任意のポインタ型に変換することができます。
根拠はint *
とdouble *
は、多くの場合、効果的に配列していることもあり、および実装は、配列がどの程度の大き知っていません。
あなたの代わりにdouble *
のdouble
を使用しているので、
*
それはあなたが定期的に、二重とは大きく異なっているポインタを、宣言していることを意味した。
C ++が安全そのようなポインタの異なるタイプへのポインタをstatic_castすることができない。
あなたはこのちょっとのことをやりたいと思っている場合は、、あなたは最初の変数を逆参照する必要があります。
r=new int(static_cast<int>(*p));
あなたはnew
を使用する必要があり、ダブルと整数が同じメモリ空間に存在することはできませんので(sanely)