[tr1/memory] Appeler get_deleter dans un template
Bonjour,
Je tourne en rond depuis plusieurs heures sans trouver la solution. Je n'arrive pas à compiler le morceau de code ci-dessous
Code:
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
| #include <tr1/memory>
class A {};
using ::std::tr1::shared_ptr;
template <class T>
struct Deleter {
void operator()(T *t) {
delete t;
}
};
template <class T>
Deleter<T> *deleter(const shared_ptr <T> & p) {
return std::tr1::get_deleter<Deleter<T> >(p);
}
int main () {
shared_ptr <A> p (new A, Deleter<A>());
Deleter<A> *d1 = std::tr1::get_deleter<Deleter<A> >(p);
assert(d1);
Deleter<A> *d2 = deleter<A>(p);
assert(d2);
return 0;
} |
J'utilise g++ 4.0.1 et voici l'erreur que j'ai. Je n'ai actuellement pas la possibilité de tester avec un autre compilateur.
Code:
1 2 3 4 5
|
g++ -Wall -pedantic -o memory memory.cpp
memory.cpp: In function 'Deleter<T>* deleter(const std::tr1::shared_ptr<_Tp>&)':
memory.cpp:16: error: 'get_deleter' is not a member of 'std::tr1'
memory.cpp:16: error: expected primary-expression before '>' token |
Le problème que je vois est que get_deleter est une fonction template amie de shared_ptr mais je ne sais pas comment m'en sortir. Je suis juste arrivé à un moment à compiler avec
Code:
1 2
|
return std::tr1::shared_ptr<T>::template get_deleter<Deleter<T> >(p); |
mais je n'avais pas encore mis dans le main les lignes avec d2.
Si quelqu'un a une idée, il est le bienvenu. Merci d'avance,