Ik kwam de volgende situatie tegen:
Het probleem zit hem in CALL 2. CALL 1 gaat goed, omdat er (volgens mij) via ADL/Koenig wordt gezocht in de namespace van het argument 'a', en de functie daar wordt gevonden. Echter, bij CALL 2 wordt de juiste functie verborgen door de eigen class member bar() en krijg je een fout over 'too many arguments'. PRefixen met bv N::bar(a) werkt ook niet; dan kan hij de functie niet vinden in N.
Hoe kan ik zorgen dat de compiler toch de juiste functie vindt? (errors overigens getest met Comeau)
---
Oh, dit fixed het... nvm
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
| namespace N { template <typename T> class A { public: friend void foo(const A<T>& a) {} friend void bar(const A<T>& a) {} }; template <typename T> class B { public: void bar() {} void test() { N::A<T> a; foo(a); // CALL 1 bar(a); // CALL 2 } }; } void bar() {} int main() { N::B<int> b; b.test(); return 0; } |
Het probleem zit hem in CALL 2. CALL 1 gaat goed, omdat er (volgens mij) via ADL/Koenig wordt gezocht in de namespace van het argument 'a', en de functie daar wordt gevonden. Echter, bij CALL 2 wordt de juiste functie verborgen door de eigen class member bar() en krijg je een fout over 'too many arguments'. PRefixen met bv N::bar(a) werkt ook niet; dan kan hij de functie niet vinden in N.
Hoe kan ik zorgen dat de compiler toch de juiste functie vindt? (errors overigens getest met Comeau)
---
Oh, dit fixed het... nvm
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
| namespace N { template <typename T> class A { public: friend void foo(const A<T>& a) {} template <typename U> friend void bar(const A<U>& a); private: mutable int x; }; template <typename T> void bar(const A<T>& a) {a.x = 5;} template <typename T> class B { public: void bar() {} void test() { N::A<T> a; foo(a); N::bar(a); } }; } void bar() {} int main() { N::B<int> b; b.test(); return 0; } |
[ Voor 23% gewijzigd door Zoijar op 18-08-2012 12:16 ]