2010-12-24 15 views
1

私はC++プログラムのコンパイルにg ++を使用していますが、int型とdooble型の間の暗黙の変換を停止したいとします。 パラメータとしてdoubleを使用する関数があります。この関数のパラメータにintを渡します。コンパイルはエラーや警告なしに渡されます。g ++コンパイラと暗黙の変換

これは私の質問ですので、どのように暗黙の変換を停止するのですか?

ありがとうございました。

+1

これは言語の一部です。 –

+0

[C++の暗黙的なプリミティブ変換に関する警告またはエラー]の重複が可能です。(http://stackoverflow.com/questions/4477139/warnings-or-errors-for-c-implicit-conversion-of-primitives) –

答えて

2

低いタイプから高いタイプへの暗黙的な変換を避けることはできません。ただし、コンパイラがC++ 0xをサポートしている場合は、 を使用できます。

void func(int x){} 

int main() 
{ 
    func({2.3}); // error: narrowing 
} 
+0

警告を送信するフラグ(-Wconversion)は変換の方向を示します。私はまだエラーを送信する方法を探しています。 – CHAKRI

+1

@CHAKRI:-Werror –

+0

@Greg Hewgill:はい、エラーメッセージなしで動作しますが、問題ありません。ありがとうございます。 – CHAKRI

4

あなたはこの試みることができる:私はマーティンの答えが進むべき道だと思います

#include <iostream> 

template<typename T> 
void func(T t); 

void func(double d) 
{ 
    std::cout << "D:" << d << "\n"; 
} 


int main() 
{ 
    func(2.3); // OK 
    func(2);  // Fails at compile time. 
} 
+0

ありがとう、私はこの方法を試して、それは動作しますが、私は私のメイクファイルで-Werror = conversionフラグを使用すると思います。それはもっと簡単で仕事をしました。 – CHAKRI

+0

微妙な違い:リンク時には失敗し、コンパイル時には失敗します。 – GingerPlusPlus

1

を。 リンク時に変換が見つかります。このことができます

template<typename T> 
void func(T) { 
    //static_assert(sizeof(T) == 0, "..."); // if you can use static_assert 
    int a[ (sizeof(T) == 0) ? 1 : -1 ]; 
} 

希望:あなたはコンパイル時に見つける必要がある場合は 、あなたはstatic_assertまたは 関数テンプレートと同様のものを追加することができます。

関連する問題