2012-03-07 4 views
2

新しいg ++バージョンの新しいLinuxシステムでプロジェクトを移植しようとしています。コンパイル中に次のように表示されます。下位互換性のためにg ++コンパイルエラーを無視します

クラス定義の中で、Customer ::でgetCustomer()をプレフィックスします。

私はカスタマー::私のコードの作品を​​削除する場合は、しかし、コードはクラス名とスコープ演算子で始まるエントリをたくさん持っています。このエラーを取り除く助けとなる方法、例えばコンパイラ指令がありますか?私のシェルgccのバージョン4.4.2 20091027(Red Hatの4.4.2-7)(GCC)

+2

これは*警告*ではなく、*警告*ではないので、実際にコードに問題がある可能性があります(これはbtwを確認できません)。フラグはその事実を変えることはできません。 – bitmask

+1

私は下投票とクローズリクエストを理解していません。これは古いG ++システムではなく、その上のプロダクションコードの一部です。ここでプログラミングの問題について話し合っていますか? – cateof

+0

@bitmaskこれは以前のバージョンではエラーではなく、コンパイラに下位互換性があるかどうか尋ねました – cateof

答えて

1

Inside a class definition, I am prefixing getCustomer() with Customer::.

から

私はあなたが意味すると仮定しています:

class Customer { 
    Customer *Customer::getCustomer() { ... } 
}; 

ドン」 t。あなたは既にクラス定義に入っているので、必要はありません.C++の標準でもこれを許可しているとは思いません(私は古いG ++が驚いたのですか?)。

これを許可する-stdフラグ(GCC 4.4.5)がないようです。

+0

はい、あなたのコードは私たちのコードの近くにあります。質問にこれを掲示しないで申し訳ありません。 -stdが必要であることを意味しますか? – cateof

+1

いいえ、私は '-std'はこれを"修正 "していないと言います。実際はあなたのコードは壊れています。 –

+4

G ++は、各バージョンで標準にどれほど近づいているかを厳しくしているので、違法なものが受け入れられていました。 –

1

このコードは-fpermissiveでコンパイルできます。(GCC 4.9.2、3.6.0を打ち鳴らすない)

私はlarsmansの解釈に基づいて、完全なプログラムをテストした:

#include <cstdio> 
class Customer { 
    public: Customer *Customer::getCustomer() { return this; } 
}; 
int main() 
{ 
    std:printf("%p\n", Customer().getCustomer()); 
} 

それは、g++ test.cppでコンパイルできませんでしたが、それはで(警告付き)コンパイルしましたg++ test.cpp -fpermissive。 Even g++ test.cpp -fpermissive -ansiおよびg++ test.cpp -fpermissive -std=c++11も機能します。

-wでは、あなたは警告を受け取ることはありませんが、必ずしも常に最良のアイディアではない場合があります。奇妙なことがあるときに通知を受けたい場合があります。

clang++ test.cpp -fpermissiveは、エラーが発生しますが、clangはパラメータ-fpermissiveを認識しているようです。おそらく誰かがそのようなコードを受け入れる方法を知っているかもしれません。