Bonjour,
j'ai un problème avec un opérateur récalcitrant ; je soupçonne fortement un problème d'ADL (Argument-dependent lookup) :Seule la ligne 35 pose souci.
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; }
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)Le plus étrange est que GCC accepte ce code tandis que Clang bute sur la même ligne :Envoyé par msvcDé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).Envoyé par clang
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.
Partager