2015-08-31 18 views
5

Başlıkta ne yazacağımı gerçekten bilmiyordum, ancak temel olarak yalnızca standart kitaplık başlıklarının yer aldığı ve "kullanma" anahtar kelimelerine sahip tek bir .cpp'm var. Kendi "üretmek (...)" işlevini yaptım. Kütüphaneyi dahil ettikten sonra, Visual Studio bana bir hata gösteriyor (fonksiyonun çağrıldığı yer), temel olarak std :: generate (...) ya da create (...) seçip seçmeyeceğini bilmiyor çünkü eşleşen argüman listeleri.Visual Studio, global ad alanında olmayan işlev hakkında uyarı veriyor

Bu bir hata mı, yoksa bir şey mi özledim? Ayrıca VS2015 kullanıyorum da ekleyebilirim. Bu sadece VC++ (2015 VS) olur

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

Lütfen ilgili kodu, tercihen bir [MCVE] (http://stackoverflow.com/help/mcve) gönderin. –

+1

... ve hata metni * verbatim *. – WhozCraig

+1

Kendi sorunuzu cevapladınız: Aynı isimle ve aynı imzayla iki fonksiyonunuz var. "Sürümünüzü" istediğiniz derleyiciye anlatmak için ':: generate()' seçeneğini kullanın. Daha iyi, kendi ad alanınızı oluşturmayı düşünün. Ya da işlevinize farklı bir ad veriyor. – paulsm4

cevap

10

ama g ++ 4.9+ de:

#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); 
} 

hata çıkışı. Buradaki sorun, zorlu Argument Dependent Lookup (Koenig Lookup).

Eklediğiniz iki yineleyiciye bakar ve std içinde "oluştur" işlevini görür, çünkü yineleyiciler de std ad boşluğundan gelir (bu, Argümana Bağımlı Arama'nın noktasıdır).

Bu sorun aslında bir noktada beni ısırdı: tie için bir kaç şey yaptı, kendi tie uygulama yazdığımda. Benimki tye'u aramam gerekti çünkü Koenig Lookup, dikkate alınan aşırı yüklerin sıralamasında eşit olmasına neden oldu ve bu şekilde bir hataya neden oldu.

Her iki önek de genel ad alanından (::generate(vec.begin(), vec.end(), ...);) arama yapmaya başlamak için :: ile üretilir veya farklı şekilde adlandırılır.

+0

Oh! Aslında "Düşünüyorum, çünkü benim argümanlarım vektör tekrarlayıcılarıdır ..." diye sormaya başladım ve Argümana Bağımlı Arama'yı hiç duymamıştım. Her gün yeni bir şeyler öğreniyorum. Teşekkür ederim! PS: Adı gen olarak değiştirdim;) –

İlgili konular