2015-08-31 15 views
5

Tôi thực sự không biết viết gì trong tiêu đề, nhưng về cơ bản tôi có một tệp .cpp, chỉ có tiêu đề thư viện chuẩn và không sử dụng từ khóa. Tôi đã tạo ra hàm "generate (...)" của riêng mình. Sau khi bao gồm thư viện, Visual Studio cho tôi thấy một lỗi (nơi mà hàm đang được gọi), về cơ bản nói rằng nó không biết nên chọn std :: generate (...) hoặc generate (...) bởi vì chúng có danh sách đối số phù hợp.Cảnh báo Visual Studio về chức năng không có trong không gian tên chung

Đây có phải là lỗi hoặc tôi đã bỏ lỡ điều gì đó không? Tôi cũng có thể thêm rằng tôi đang sử dụng 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); 
} 

Lỗi đầu ra:

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

Vui lòng đăng mã có liên quan, tốt nhất là [MCVE] (http://stackoverflow.com/help/mcve). –

+1

... và văn bản lỗi * nguyên văn *. – WhozCraig

+1

Bạn đã trả lời câu hỏi của riêng mình: bạn có hai hàm có cùng tên và cùng một chữ ký. Sử dụng ':: generate()' để nói cho trình biên dịch bạn muốn "phiên bản của bạn". Tốt hơn, hãy xem xét việc tạo không gian tên của riêng bạn. Hoặc cho chức năng của bạn một tên khác. – paulsm4

Trả lời

10

Điều này xảy ra trên không chỉ là VC++ (VS 2015), nhưng g ++ 4.9+ là tốt. Vấn đề ở đây là khó khăn Argument Dependent Lookup (Koenig Lookup).

Nó xem xét hai trình lặp mà bạn đang thêm và nó thấy hàm "tạo" trong std vì các trình vòng lặp cũng đến từ không gian tên std (đây là điểm của Truy vấn phụ thuộc đối số).

Sự cố này thực sự khiến tôi gặp khó khăn tại một thời điểm: khi tôi đã viết triển khai tie của riêng mình đã thực hiện một vài điều bổ sung cho tie. Tôi đã phải gọi điện thoại của tôi tye vì Koenig Lookup gây ra tình trạng quá tải được coi là bằng nhau trong bảng xếp hạng của họ và do đó gây ra một lỗi như thế này.

Hoặc tiền tố tạo với :: để bắt đầu tra cứu từ không gian tên chung (::generate(vec.begin(), vec.end(), ...);) hoặc đặt tên khác.

+0

Ồ! Tôi thực sự bắt đầu nghĩ rằng "Tôi tự hỏi liệu đó có phải là vì các lập luận của tôi là các vòng lặp vector ..." Và tôi chưa bao giờ nghe nói về Truy vấn phụ thuộc đối số! Vâng, tôi học một cái gì đó mới mỗi ngày. Cảm ơn bạn! PS: Tôi đã đổi tên thành gen;) –

Các vấn đề liên quan