2012-02-13 8 views
0

私はC++でプログラミングを始めたばかりで、テンプレートを使って遊んでいました。このC++コードで何が問題になっていますか?

実行時に次のコードが失敗し、私は理由を知りません。 C++標準では、する必要があり、物事を比較するための

bool maxCompare(string* s1,string* s2){ 
    cout<<*s1<<endl; 
    cout<<*s2<<endl;  
    return true; //If I comment this line and instead use the line below, it works fine. 
    //return *s1 < *s2; 
} 

int main() 
{ 
    string* s1=new string("Hello"); 
    string* s2=new string("Hi"); 
    string *s3= max(s1,s2,maxCompare); 
} 
+2

'G ++ -g -Wall source.cpp'と比べて' GDB/a.out'とGDBで: 'run'とbt''よりも、それが失敗した...それともあれば」十分に再奇妙な: 'スタート; s; s; s; ; s ... ':) – Vyktor

+1

' max'とは... –

+1

どのコンパイラを使っていますか?デバッグモードでMSVCでこれを行うことはできません – mkaes

答えて

4

オペレーターは無効です。 stlのmaxの実装では、比較関数のアサーションがあるので、a < bb < aの両方が真になることはありません。少し考えてみると、これは決して実際には起こらないはずです。 2番目の関数にはこの問題がないため、2番目の関数にはこの問題がありません。また、falseを返すかどうかチェックしてください。

+0

"return false;"作品!どうやって? – Prashanth

+0

@Prashanth: 'a

4

それはおそらく(スタジオ対により)ので、いくつかの安全性チェックの失敗..

を(それだけのサンプルコードで、生産に使用されていないことに注意してください)比較が正常に行われます。a < bがtrueの場合、b < aよりfalseを返す必要があります。

Visual Studioでは、(デバッグ用のビルド時に)いくつかの内部チェックが行われます。しかし、あなたの比較は常に真実になるので、正しく動作しません。

それ以外のもの:正確な問題を説明し、あなたが何を含むかを教えてください。 "string"はそれ自体から何かではありません - std :: stringは標準で定義されていますが、おそらくusing namespace stdどこかに文字列の前にstd ::を書く必要がなくなります。 - しかし、これは悪いと考えられ、避けるべきです。

+0

+1:正確な問題を記述してください – nkint

4

明らかに常にtrueを返す関数は厳密な弱い順序ではありません。したがって、maxの動作は定義されておらず、コンパイラは必要な処理を行うことができます。たとえば、デーモンをあなたの鼻から飛ばすことができます。

後で返される値を使用する場合は厳密な弱い順序であるため、コードは期待通りに機能します。

注:は、string*を使用しています。 C++ではポインタを渡すことはほとんどありません(代わりに普通の定数参照)。newをほとんど使用せず、deleteをほとんど使用しないでください(std::auto_ptr(C++ 03)またはstd::unique_ptr(C++ 11)) )。ストリング(と他のほとんどのSTLコンテナ)の場合は、値でそれを使用する必要があります。また、const参照に最適化する関数に渡すためにのみ使用してください。

+2

+1ノーズデーモン –

0

このコードは自分のgdb(7.1)とg ++(4.4.3) でうまく動作しますかg ++とgdbのバージョンを投稿できますか?
バイナリをコンパイルシステムとは別のシステムで実行する場合は、 静的リンクを強制して再テストしてください。
また、デバッグ中に表示されるエラーを投稿してください。
BTw: s1 > s2 lib演算子を使用しても問題ありません。

g++ -g -Wall source.cpp -static 
関連する問題