Ik ben een beetje aan het experimenteren met templates en wil graag een friend gebruiken om de '+' & '-' te overloaden om het gedrag voor de template class vast te leggen.
Deze code compileert met de volgende warnings:
Wat doe ik verkeerd?
PS: Ik gebruik g++.
C++:
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
| #include <iostream> using namespace std; // Declare friends as templates template <typename T> class Type; template <typename T> Type<T> operator +(T arg1, Type<T> arg2); template <typename T> Type<T> operator -(T arg1, Type<T> arg2); template <typename T> class Type { private: T x, y; public: // Constructors Type() { }; Type(T i, T j) { x = i; y = j; } // And use friends for the reverse: <T> + & - Type<T> friend Type<T> operator +(T arg1, Type<T> arg2); friend Type<T> operator -(T arg1, Type<T> arg2); // Send x & y to standard output void show(); }; template <typename T> Type<T> operator +(T arg1, Type<T> arg2) { Type<T> temp = arg2; temp.x = arg2.x + arg1; temp.y = arg2.y + arg1; return temp; } template <typename T> Type<T> operator -(T arg1, Type<T> arg2) { Type<T> temp = arg2; temp.x = arg2.x - arg1; temp.y = arg2.y - arg1; return temp; } template <typename T> void Type<T>::show() { cout << "X, Y: " << x << ", " << y << endl; } int main() { Type<int> a(3, 4); Type<float> b(3.0, 5.4); Type<char> c('X', 'D'); a.show(); b.show(); c.show(); cout << endl; // a = a + 10; Dit werkt, maar is in deze testcase even weggelaten b = 5.0 + b; // ** Deze wil ik dus werkend krijgen. ** // c = c + 1; // a.show(); b.show(); // c.show(); return 0; } |
Deze code compileert met de volgende warnings:
Als ik die suggestie toepas, compileert de code niet meer:warning: friend declaration ‘Type<T> operator+(T, Type<T>)’ declares a non-template function
note: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here)
Bij het linken krijg ik, na het compileren zonder de extra <>:error: declaration of ‘operator+’ as non-function
error: expected ‘;’ before ‘<’ token
Op aanraden van deze FAQ heb ik de templated prototypes nog even voor de class definitie toegevoegd, maar dat mocht dus niet baten. De compiler denkt nog steeds dat het non-template functies zijn, maar zodra ik de blijkbaar benodigde <> toevoeg, werkt het helemaal niet meer.(.text+0xae): undefined reference to `operator+(float, Type<float>)'
Wat doe ik verkeerd?
PS: Ik gebruik g++.