Bonjour,

j'ai un problème avec un opérateur récalcitrant ; je soupçonne fortement un problème d'ADL (Argument-dependent lookup) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
namespace test
{  
    template<typename L, typename R>
    int operator|(const L & , const R &)
    { return 0; }
 
    template<typename T>
    struct enable
    {};
}
 
namespace foo
{
    struct want_op : test::enable<want_op>
    {  
        enum enum_type
        { inner
        };
    };
 
    enum enum_type
    { outer
    };
}
 
int main()
{
    //using test::operator|;
 
    foo::want_op o;
    o | foo::want_op::inner;
    10         | o;
    foo::outer | o;
 
    foo::want_op::inner | o; 
}
Seule la ligne 35 pose souci.

Le problème existe avec MSVC 2005/8.0 () mais est également reproductible avec la dernière version en ligne (Compiler version: 19.11.25331.0)
Citation Envoyé par msvc
main.cpp(35): error C2676: binary '|': 'foo::want_op::enum_type' does not define this operator or a conversion to a type acceptable to the predefined operator
Le plus étrange est que GCC accepte ce code tandis que Clang bute sur la même ligne :
Citation Envoyé par clang
main.cpp:35:25: error: invalid operands to binary expression ('int' and 'foo::want_op') foo::want_op::inner | o;
Décommenter la ligne using test::operator|; résout le problème pour tous les compilateurs (d'où l'hypothèse d'un problème d'ADL).

J'aurais pensé qu'il s'agit d'un bug si MSVC et Clang n'était pas d'accord, mais je ne vois pas non plus quelle règle du standard pourrait s'appliquer ici.


Merci d'avance.