Bonjour,
Voici un code :
La ligne 43 ne compile pas. C'est normal, l'opérateur de conversion est explicite, il faut donc faire un cast.
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
37
38
39
40
41
42
43
44
45 #include <iostream> template<typename T> class Wrapper { public: Wrapper(T value) : raw_data(value) { } explicit operator T() const { return raw_data; } friend const Wrapper operator *(const Wrapper& multiplier, const Wrapper& multiplicand) { T raw_result = multiplier.raw_data * multiplicand.raw_data; return Wrapper(raw_result); } private: T raw_data; }; using MyWrapper = Wrapper<int>; template<typename U> int multiply_then_convert(U value) { U multiplied = 2 * value; int converted = multiplied; // WTF? explicit? return converted; } int main() { { // Avec fonction template MyWrapper value = 25; int converted = multiply_then_convert(value); } { // Equivalent MyWrapper value = 25; MyWrapper multiplied = 2 * value; int converted = multiplied; } }
La ligne 28 fait la même chose. L'instanciation de cette fonction template pour un tel U (= Wrapper<int>) ne devrait donc pas compiler. Or, la ligne 36 passe comme une lettre à la Poste. L'exécution produit le résultat attendu (50).
Pourquoi ?
Merci d'avance pour vos réponses !![]()
Partager