2015-08-31 18 views
5

Non sapevo veramente cosa scrivere nel titolo, ma fondamentalmente ho un singolo .cpp, con solo le intestazioni di libreria standard incluse e nessuna parola chiave "using". Ho creato la mia funzione "genera (...)". Dopo aver incluso la libreria, Visual Studio mi mostra un errore (in cui viene chiamata la funzione), sostanzialmente dicendo che non sa se scegliere std :: generate (...) o generare (...) perché hanno liste di argomenti corrispondenti.Avviso di Visual Studio sulla funzione non nel namespace globale

È un bug o mi sono perso qualcosa? Potrei anche aggiungere che sto usando VS2015.

#include <iostream> 
#include <ctime> 
#include <vector> 
#include <algorithm> 

template<typename Iter, typename Function> 
Function generate(Iter begin, Iter end, Function f) 
{ 
    while (begin != end) 
    { 
     *begin = f(); 
     ++begin; 
    } 
    return f; 
} 

class Random 
{ 
public: 
    Random(int low, int high) 
     : mLow(low), mHigh(high) 
    {} 

    int operator()() 
    { 
     return mLow + rand() % (mHigh - mLow + 1); 
    } 

private: 
    int mLow; 
    int mHigh; 
}; 

class Print 
{ 
    void operator()(int t) 
    { 
     std::cout << t << " "; 
    } 
}; 

int main() 
{ 
    srand(time(0)); 

    std::vector<int> intVec; 
    intVec.resize(15); 

    Random r(2, 7); 
    generate(intVec.begin(), intVec.end(), r); 
} 

uscita Error:

1>------ Build started: Project: Functor, Configuration: Debug Win32 ------ 
1> Main.cpp 
1>c:\users\michael sund\documents\visual studio 2015\projects\gi_cpp\functor\main.cpp(44): warning C4244: 'argument': conversion from 'time_t' to 'unsigned int', possible loss of data 
1>c:\users\michael sund\documents\visual studio 2015\projects\gi_cpp\functor\main.cpp(50): error C2668: 'generate': ambiguous call to overloaded function 
1> c:\users\michael sund\documents\visual studio 2015\projects\gi_cpp\functor\main.cpp(7): note: could be 'Function generate<std::_Vector_iterator<std::_Vector_val<std::_Simple_types<int>>>,Random>(Iter,Iter,Function)' 
1>   with 
1>   [ 
1>    Function=Random, 
1>    Iter=std::_Vector_iterator<std::_Vector_val<std::_Simple_types<int>>> 
1>   ] 
1> c:\program files (x86)\microsoft visual studio 14.0\vc\include\algorithm(1532): note: or  'void std::generate<std::_Vector_iterator<std::_Vector_val<std::_Simple_types<int>>>,Random>(_FwdIt,_FwdIt,_Fn0)' [found using argument-dependent lookup] 
1>   with 
1>   [ 
1>    _FwdIt=std::_Vector_iterator<std::_Vector_val<std::_Simple_types<int>>>, 
1>    _Fn0=Random 
1>   ] 
1> c:\users\michael sund\documents\visual studio 2015\projects\gi_cpp\functor\main.cpp(50): note: while trying to match the argument list '(std::_Vector_iterator<std::_Vector_val<std::_Simple_types<int>>>, std::_Vector_iterator<std::_Vector_val<std::_Simple_types<int>>>, Random)' 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 
+2

Si prega di inviare il codice pertinente, preferibilmente un [MCVE] (http://stackoverflow.com/help/mcve). –

+1

... e il testo dell'errore * verbatim *. – WhozCraig

+1

Hai risposto alla tua stessa domanda: hai due funzioni con lo stesso nome e la stessa firma. Usa ':: generate()' per dire al compilatore che vuoi "la tua versione". Meglio, considera la possibilità di creare il tuo spazio dei nomi. O dando alla tua funzione un nome diverso. – paulsm4

risposta

10

Questo accade non solo VC++ (VS 2015), ma g ++ 4.9+ pure. Il problema qui è il difficile Argument Dependent Lookup (Koenig Lookup).

Analizza i due iteratori che si stanno aggiungendo e vede la funzione "generare" in std perché gli iteratori provengono anche dallo spazio dei nomi std (questo è il punto di ricerca dipendente dall'argomento).

Questo problema in realtà mi ha colpito a un certo punto: quando ho scritto la mia implementazione , ho aggiunto alcune cose a tie. Ho dovuto chiamare il mio tye perché la ricerca di Koenig ha causato che i sovraccarichi considerati fossero uguali nella loro classifica e quindi causano un errore come questo.

Un prefisso può essere generato con :: per avviare la ricerca dallo spazio dei nomi globale (::generate(vec.begin(), vec.end(), ...);) o denominarlo in modo diverso.

+0

Oh! In realtà ho iniziato a pensare "Mi chiedo se è perché i miei argomenti sono iteratori vettoriali ..." E non avevo mai nemmeno sentito parlare di Argoment Dependent Lookup! Bene, imparo qualcosa di nuovo ogni giorno. Grazie! PS: ho cambiato il nome in gen;) –

Problemi correlati