Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Template qui ne s'intancie pas ?

1 réponse
Avatar
Pierre THIERRY
Hello,

j'ai un petit souci avec une fonction template. Voilà mon code, sachant
que TreeFactory<T, U>::Tree est un typedef sur boost::variant<int,
Node*, Leaf*>, Node et Leaf étant des classes définies dans
TreeFactory<T, U>...

------------------------------------------------------------------------
#include <iostream>
#include <boost/variant/get.hpp>
#include "twotypestree.h"

using namespace std;
using namespace boost;
using namespace twotypestree;

template<typename T, typename U> void stream_tree(ostream& out, const typename TreeFactory<T, U>::Tree& tree)
{
try
{
typedef typename TreeFactory<T, U>::Node* Node_ptr;
Node_ptr node = get<Node_ptr>(tree);
out << node->get_payload() << "( ";
stream_tree(out, node->get_left());
out << " , ";
stream_tree(out, node->get_right());
out << " )";
}
catch (bad_get) {}

try
{
typedef typename TreeFactory<T, U>::Leaf* Leaf_ptr;
Leaf_ptr leaf = get<Leaf_ptr>(tree);
out << leaf->get_payload();
}
catch (bad_get) {}
}

int main(int argc, char** argv)
{
TreeFactory<int, float> factory;

TreeFactory<int,float>::Tree leaf1 = factory.leaf(5.5);
TreeFactory<int,float>::Tree leaf2 = factory.leaf(4.5);
TreeFactory<int,float>::Tree node = factory.node(0, leaf1, leaf2);

stream_tree(cout, node);
cout << endl;
}
------------------------------------------------------------------------

Mon problème est qu'à la compilation (gcc 4.0.4 20060507 prerelease),
j'obtiens l'erreur suivante :

test.cpp:42: erreur: no matching function for call to 'stream_tree(std::ostream&, boost::variant<twotypestree::Tree_Placeholder, twotypestree::TreeFactory<int, float>::Node*, twotypestree::TreeFactory<int, float>::Leaf*>&)'

(en fait, le variant comprend encore une tripotée d'argument template,
mais j'ai coupé)

Et je ne vois pas ce qui manque pour qu'il trouve ladite fonction, a
priori pourtant sous son nez.

Confusément,
Nowhere man
--
nowhere.man@levallois.eu.org
OpenPGP 0xD9D50D8A

1 réponse

Avatar
Pierre THIERRY
Le Fri, 02 Jun 2006 22:48:52 +0200, Pierre THIERRY a écrit :
template<typename T, typename U> void stream_tree(ostream& out, const typename TreeFactory<T, U>::Tree& tree)
{
try
{
typedef typename TreeFactory<T, U>::Node* Node_ptr;
Node_ptr node = get<Node_ptr>(tree);
out << node->get_payload() << "( ";
stream_tree(out, node->get_left());
out << " , ";
stream_tree(out, node->get_right());
out << " )";
}
catch (bad_get) {}


Toutes mes excuses, j'ai lu les messages d'erreur trop vite, sans faire
vraiment attention aux numéros de ligne. Le problème était bien sûr que
j'appelais stream_tree(...) au lieu de stream_tree<T,U>(...).

Honteusement,
Nowhere man
--

OpenPGP 0xD9D50D8A