2016-08-19 19 views
0

私は1つの厄介な問題を抱えており、すでに調査中です。C++エラー: 'インライン'は関数にしか表示されません

私はかなり古いC++ - ishコードのプロジェクトを持っています.C++ 11コードを追加する必要があります。問題は、これらの定義によって引き起こされる

set (CMAKE_CXX_STANDARD 11) 

#define lt(a, b) ( ((a) < -b)) 
#define ge(a, b) (! ((a) < -b)) 
#define le(a, b) ( ((a) <= b)) 
#define gt(a, b) (! ((a) <= b)) 
#define eq(a, eps) ((((a) <= eps) && !((a) < -eps))) 
#define ne(a, eps) (!eq(a,eps)) 

これは、それは私のCMakelist.txtに以下を追加する問題は、私が導入されたことは非常に特定ですので、このプロジェクトは、以前に、コンパイルされました私が得るエラー:

/Users/bs/util.h:284:22: note: expanded from macro 'eq' 
#define eq(a, eps) ((((a) <= eps) && !((a) < -eps))) 
        ^
In file included from /Users/bs/geom.cc:35: 
In file included from /Users/bs/coord.h:30: 
In file included from /Users/bs/vronivector.h:6: 
In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iostream:38: 
In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ios:216: 
In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__locale:15: 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/string:678:12: error: 'inline' can 
     only appear on functions 
    static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT 
     ^
fatal error: too many errors emitted, stopping now [-ferror-limit=] 
20 errors generated. 
make[2]: *** [src/CMakeFiles/vroni.dir/geom.cc.o] Error 1 
make[1]: *** [src/CMakeFiles/vroni.dir/all] Error 2 
make: *** [all] Error 2 

ここで問題は何ですか?それは修正できますか?

+0

['std :: char_traits :: eq'] //en.cppreference.com/w/cpp/string/char_traits/cmp)、マクロは常に間違っています – MSalters

+1

なぜこれらのマクロを定義しているのですか?マクロはなぜですか? –

+0

私が言ったように、私はレガシーコードに対処しなければならない。要するに:非常に複雑なコードだが、数学的観点からは十分にテストされたコード、ソフトウェアの観点からは非常に愚かなコード。私は実際には、レガシーコードが機能するように、プロジェクト全体を再度リベースしました。リファクタリングの試みは、頭痛の原因となりました。 – benjist

答えて

2

シンボル 'eq'の名前に矛盾があります。残念なことにcスタイルのマクロはリテラルなテキスト置換を行うため、eqに関連付けられたテキストが次のようなエラーメッセージを表示するステートメントに埋め込まれます。

static inline _LIBCPP_CONSTEXPR bool ((((char_type __c1) <= eps) && !(char_type __c1) < -eps)) _NOEXCEPT 

最良の解決策は、マクロの使用をやめて、 'eq'などの機能を定義する別の方法を見つけることです。

あなたは、例えばのようなものでEQマクロを置き換えることができます:

A-それほど良くない解決策がシンボルと競合することはほとんどありません、あなたのマクロの命名規則を思い付くことであろう
template<typename T>bool eq(T a,T eps) 
{ 
    return (a <= eps && a >= -eps); 
} 

(例えば、マクロEQやEQ_に名前を付けることができます(先頭のアンダースコアは使用しないでください)。

関連する問題