Puur uit interesse, volgende geval:
Hier kan de compiler bij de call naar foo niet het template argument 'U' bepalen. Ik weet niet precies waarom niet, maar volgens mij gewoon omdat het niet in het lijstje met gevallen staat dat ondersteund moet worden. Kan me ook voorstellen dat omdat hij niks over Ptr weet totdat hij het type van U weet daar problemen onstaan oid.
Maar goed, je kan het oplossen door foo<int>(a); aan te roepen, maar dat vind ik omslachtig. Je kan het oplossen door foo() te declareren als foo(std::shared_ptr<A<U> >) maar dan raak je de mogelijkheid kwijt je pointer type te wijzigen. Je kan het met een templated typedef doen, maar dan heb je heb je een nieuwe compiler nodig... Wat is nou een goeie manier om dit op te lossen? Zo'n soort patroon zal toch wel vaker voorkomen?
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| template <typename T> class A { public: typedef std::shared_ptr<A<T> > Ptr; A() {} ~A() {} }; template <typename U> void foo(typename A<U>::Ptr ptr) { } int main() { A<int>::Ptr a(new A<int>()); foo(a); return 0; } |
Hier kan de compiler bij de call naar foo niet het template argument 'U' bepalen. Ik weet niet precies waarom niet, maar volgens mij gewoon omdat het niet in het lijstje met gevallen staat dat ondersteund moet worden. Kan me ook voorstellen dat omdat hij niks over Ptr weet totdat hij het type van U weet daar problemen onstaan oid.
Maar goed, je kan het oplossen door foo<int>(a); aan te roepen, maar dat vind ik omslachtig. Je kan het oplossen door foo() te declareren als foo(std::shared_ptr<A<U> >) maar dan raak je de mogelijkheid kwijt je pointer type te wijzigen. Je kan het met een templated typedef doen, maar dan heb je heb je een nieuwe compiler nodig... Wat is nou een goeie manier om dit op te lossen? Zo'n soort patroon zal toch wel vaker voorkomen?