2010-06-22 15 views
0

J'essaie d'appeler une fonction non-membre d'une classe dérivée d'une classe de base, mais obtenir cette erreur:Accès à une fonction non-membre d'une classe dérivée d'une classe de base

error: no matching function for call to 'generate_vectorlist(const char&)'

est ici les extraits de code pertinents de la classe de base:

//Element.cpp 
#include "Vector.h" 
    ... 

string outfile; 
cin >> outfile; 
const char* outfile_name = outfile.c_str(); 
generate_vectorlist(*outfile_name); //ERROR 
... 

et la classe dérivée (ce qui est une classe de modèle, de sorte que tout est dans l'en-tête):

//Vector.h 
    template <class T> 
void generate_vectorlist(const char* outfile_name = "input.txt") 
{ 
    std::ofstream vectorlist(outfile_name); 
    if (vectorlist.is_open()) 
     for (Element::vciter iter = Element::vectors.begin(); iter!=Element::vectors.end(); iter++) 
     { 
      Vector<T>* a = new Vector<T>(*iter); 
      vectorlist << a->getx() << '\t' << a->gety() << '\t'<< a->getz() << std::endl; 
      delete a; 
     } 
    else { std::cout << outfile_name << " cannot be opened." << std::endl;} 
    vectorlist.close(); 
} 

Je suppose qu'il y a juste une petite syntaxe qui me manque. Des idées?

+3

"une fonction non-membre d'une classe dérivée" Qu'est-ce que c'est? Les classes ne peuvent pas avoir de fonctions non-membres; la définition d'une fonction non membre est que ce n'est pas un membre. Voulez-vous dire une fonction de membre statique? –

+0

La fonction non-membre d'une classe dérivée est un mauvais terme pour "la fonction non-membre définie dans un en-tête/un fichier source spécifique". Si cela signifie une fonction de membre statique, alors oui, oui je voulais dire ça! –

Répondre

3

Vous déréférencer le pointeur de sorte que vous passez un const const, pas un const char *.

essayez ceci:

generate_vectorlist(outfile_name); 
3

Vous avez deux problèmes:

  1. generate_vectorlist prend un const char *, pas const char &. Le type de modèle ne figure pas dans la signature de la fonction, de sorte que le compilateur ne peut pas en déduire le type. Vous devez donc le spécifier (en utilisant int dans mon exemple).

Vous devez faire:

generate_vectorlist<int>(outfile_name); 
1

Dans le premier bit, essayez: generate_vectorlist (outfile_name);

Vous devriez passer un pointeur de caractère, pas un caractère.

1

Vous devez spécifier l'argument du modèle. Il n'y a rien que le compilateur peut utiliser pour en déduire le type T. Donc, vous devrez l'appeler comme generate_vectorlist<MyType>(outfile_name);, en utilisant le type approprié pour MyType.

1

Ceci est le problème:

template <class T> 
void generate_vectorlist(const char* outfile_name = "input.txt") 

Le compilateur ne peut pas déduire le type de T, donc il n'a aucune idée de ce qui generate_vectorlist à utiliser.

appel comme ceci:

generate_vectorlist<vectortype>(outfile_name); 

Bien que je suggère en fait que ce code ne fait pas de sens en premier lieu.