2017-02-02 22 views
1

を与えながら、私が打ち鳴らす上でコンパイルするために、次のコードを取得しようとしていますが、それは次のエラーで失敗します。私は、Visual Studioをコンパイルしようとした関数ポインタはVCにコンパイル++打ち鳴らすはエラー

error: no member named 'operator<' in the global namespace 

標準準拠に切り替えるには/ Zaを使用しますが、まだそれを受け入れているようです。私を啓発してください。

struct A 
{ 
    int m_test; 
    A(int test) 
    : m_test(test) 
    { 

    } 

    friend bool operator<(A left, A right); 
}; 

int main() 
{ 
    typedef bool(*TCompare)(A,A); 
    TCompare compare = &::operator<; 

    compare(9,7); 
} 

VC++出力:https://godbolt.org/g/LAz56n

クラン出力:https://godbolt.org/g/zC2InO

+0

ここで、*演算子関数を定義していますか? –

答えて

5

Clangが正しいです。サンプルコードの場合、friend declarationsによって導入されたoperator<という名前は、グローバル名前空間のメンバーになりますが、名前検索にはが表示されません。ADLでしか見つかりませんが、ADLは関数呼び出し式にのみ適用されますが、&::operator<ではありません。

Names introduced by friend declarations within a non-local class X become members of the innermost enclosing namespace of X , but they do not become visible to lookup (neither unqualified nor qualified) unless a matching declaration is provided at namespace scope, either before or after the class definition. Such name may be found through ADL which considers both namespaces and classes.

修正するには、グローバル名前空間のスコープに一致する宣言を追加する必要があります。例えば

struct A 
{ 
    int m_test; 
    A(int test) 
    : m_test(test) 
    { 

    } 

    friend bool operator<(A left, A right); 
}; 

// add a matching declaration at namespace scope 
bool operator<(A left, A right); 

int main() 
{ 
    typedef bool(*TCompare)(A,A); 
    TCompare compare = &::operator<; 

    compare(9,7); 
} 

bool operator<(A left, A right) { 
    ... 
} 
5

それはVC++バグです。コードは無効です。

友人宣言は、宣言された名前をグローバル名前空間に導入しません。それでもクラスの外に宣言する必要があります。

+1

あなたは[friend name injection](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1995/N0777.pdf)と一緒にここで歴史をよく言及することができます。 –

+0

ええと、リンク(私はWikipediaからリッピングしました)はあまり関係がないようです。しかし要するに、Visual C++はこれと下位互換性のためにこれを可能にしています。ルールが変更されました。 –

+0

規則の変更は、標準化プロセスの間に、Annotated Reference Manualの後、1989年頃から1998年の最初の標準の前に行われたようです。しかし、私のARMのコピーは、そのような大きな紙の中にある死んだ樹の本です箱はここから遠いので、私は実際にこれを確認することはできません。 –

関連する問題