2017-07-26 1 views
1

J'ai une classe nommée Hashtable avec plusieurs méthodes pour le chargement en bloc de données d'entrée. Chacune de ces méthodes prend en charge différents formats de fichiers via des modèles et est également surchargée de sorte qu'elle peut être appelée avec une chaîne (nom de fichier) ou un objet analyseur comme premier argument.Impossible d'instancier une fonction de modèle surchargée

Voici un exemple. La méthode consume_seqfile est définie dans l'en-tête de la classe comme si.

template<typename SeqIO> 
void consume_seqfile(
    std::string const &filename, 
    unsigned int &total_reads, 
    unsigned long long &n_consumed 
); 

template<typename SeqIO> 
void consume_seqfile(
    read_parsers::ReadParserPtr<SeqIO> &parser, 
    unsigned int &total_reads, 
    unsigned long long &n_consumed 
); 

Et puis instancié en bas du fichier de définition de classe comme si.

template void Hashtable::consume_seqfile<FastxReader>(
    std::string const &filename, 
    unsigned int &total_reads, 
    unsigned long long &n_consumed 
); 


template void Hashtable::consume_seqfile<FastxReader>(
    ReadParserPtr<FastxReader>& parser, 
    unsigned int &total_reads, 
    unsigned long long &n_consumed 
); 

Tout cela fonctionne très bien, et cela depuis des mois. J'essaie maintenant d'ajouter une nouvelle variante de cette méthode qui a un argument supplémentaire. Il est défini dans l'en-tête comme si.

template<typename SeqIO> 
void consume_seqfile_with_mask(
    std::string const &filename, 
    Hashtable* mask, 
    unsigned int &total_reads, 
    unsigned long long &n_consumed 
); 

template<typename SeqIO> 
void consume_seqfile_with_mask(
    read_parsers::ReadParserPtr<SeqIO>& parser, 
    Hashtable* mask, 
    unsigned int &total_reads, 
    unsigned long long &n_consumed 
); 

Et instancié dans le fichier source comme tel. Cependant, lorsque j'essaie de compiler, j'obtiens le message d'erreur suivant:

src/oxli/hashtable.cc:635:26: error: explicit instantiation of undefined function template 'consume_seqfile_with_mask' 
template void Hashtable::consume_seqfile_with_mask<FastxReader>(
         ^
include/oxli/hashtable.hh:281:10: note: explicit instantiation refers here 
    void consume_seqfile_with_mask(

Mes compétences Google/StackOverflow me manquent. Une idée de ce qui pourrait causer ce problème?

MISE À JOUR: Le problème était avec le code non affiché. I avait une définition de fonction, mais il manquait le préfixe Hashtable:: approprié pour l'espace de noms. Donc ... la fonction était en effet indéfinie. Problème résolu en incluant correctement le namespacing.

Répondre

0

Vous déclarez ces fonctions et instanciez-les explicitement plus tard, mais avez-vous une définition de la fonction?

+0

Oui et non. Voir la mise à jour. La fonction a été définie, mais j'ai accidentellement omis l'espace de noms. Combler cela a résolu le problème. –