2011-02-02 17 views
7

Il seguente bit di codice non riesce a compilare. L'errore sembra essere una specie di chiamata ambigua alla routine di fusione. La mia comprensione è che STL ha una routine di fusione trovata nello spazio dei nomi std, ma per quanto posso dire il nome unione nel codice qui sotto dovrebbe essere unico.Errore del compilatore C++ ambiguo

Se si rinomina l'unione in xmerge, tutto funziona. Quale potrebbe essere il problema? da dove viene il nome scontro?

http://codepad.org/uAKciGy5

#include <iostream> 
#include <iterator> 
#include <vector> 

template<typename InputIterator1, 
     typename InputIterator2, 
     typename OutputIterator> 
void merge(const InputIterator1 begin1, const InputIterator1 end1, 
      const InputIterator2 begin2, const InputIterator2 end2, 
      OutputIterator out) 
{ 
    InputIterator1 itr1 = begin1; 
    InputIterator2 itr2 = begin2; 
    while ((itr1 != end1) && (itr2 != end2)) 
    { 
     if (*itr1 < *itr2) 
     *out = *itr1, ++itr1; 
     else 
     *out = *itr2, ++itr2; 
     ++out; 
    } 
    while (itr1 != end1) *out++ = *itr1++; 
    while (itr2 != end2) *out++ = *itr2++; 
} 

int main() 
{ 
    std::vector<int> l1; 
    std::vector<int> l2; 
    std::vector<int> merged_list; 

    merge(l1.begin(),l1.end(), 
     l2.begin(),l2.end(), 
     std::back_inserter(merged_list)); 

    return 0; 
} 
+0

Qual è il messaggio di errore? Il mio compilatore non si lamenta, compila il codice bene. – Oswald

+0

Compila bene qui. (gcc 4.4.3) –

+3

Perché dovrei dargli un nome diverso? non sto usando lo spazio dei nomi std. –

risposta

16

compilatore è sempre confuso tra il merge funzione e il std::merge definito nel algorithm. Utilizzare ::merge per rimuovere questa ambiguità. Questa chiamata è ambigua poiché il compilatore usa Argument Dependendent Lookup per cercare la funzione quando viene utilizzato il nome di funzione non qualificato.

+1

Questo è ciò che penso stia accadendo, ma non dovrebbe essere quella routine nello spazio dei nomi std? –

+7

@Reyzooti: il problema è che la ricerca dipendente dall'argomento implica che poiché i tipi passati alla chiamata della funzione sono definiti in 'std', lo spazio dei nomi' std' entra nello spazio di ricerca. Fondamentalmente questo è ciò che ti permette di scrivere 'std :: string (" Hi ") + std :: string (" there ")' al di fuori del namespace 'std'. L''operatore + 'per le stringhe è definito all'interno di' std', ma sicuramente vuoi che quel codice funzioni senza dover scrivere 'std :: operator + (str1, str2)' o 'str1.operator + (str2) ', a seconda di come è definito l'operatore, che non mi interessa. –

+5

@Reyzooti: Sì, la versione della libreria standard di 'merge' si trova nello spazio dei nomi' std' - ma ADL continua a farla considerare come un candidato perché gli argomenti della funzione provengono dal namespace 'std' (per i dettagli di come funziona ADL vedere l'articolo di Wikipedia). –

Problemi correlati