2012-03-06 38 views
9

Cách chính xác để sử dụng std::ref là gì? Tôi đã cố gắng sau mã trong VS2010 và nó không biên dịch:Làm thế nào để sử dụng std :: ref?

#include <vector> 
#include <algorithm> 
#include <iostream> 
#include <functional> 
using namespace std; 
struct IsEven 
{ 
    bool operator()(int n) 
    { 
     if(n % 2 == 0) 
     { 
      evens.push_back(n); 
      return false; 
     } 

     return true; 
    } 

    vector<int> evens; 
}; 
int main(int argc, char **argv) 
{ 
    vector<int> v; 
    for(int i = 0; i < 10; ++i) 
    { 
     v.push_back(i); 
    } 

    IsEven f; 
    vector<int>::iterator newEnd = remove_if(v.begin(), v.end(), std::ref(f)); 
    return 0; 
} 

Lỗi:

c: file \ program (x86) \ microsoft visual studio 10.0 \ vc \ bao gồm xxresult \ (28): lỗi C2903: 'result': biểu tượng không phải là mẫu lớp hay mẫu chức năng

c: \ program files (x86) \ microsoft visual studio 10.0 \ vc \ include \ xxresult (28): lỗi C2143: lỗi cú pháp: thiếu ';' trước khi '<'

Thêm một số chi tiết ...

+0

Nó biên dịch với g ++ (cả 4.6 và 4.8). – kennytm

+0

@nabulke: ngay cả trong C++ 11? Tôi nghĩ rằng điều này sẽ làm việc .. – Asha

Trả lời

8

Có lỗi hoặc bộ lỗi trong việc triển khai Visual C++ 10.0 của std::ref.

Báo cáo đã được sửa cho Visual C++ 11; xem số earlier question about it của tôi.

STL tại Microsoft đã trả lời thusly: "Chúng tôi đã cố định nó, và việc sửa chữa sẽ có mặt tại VC11 RTM (Tuy nhiên, việc sửa chữa đã không nhận được vào Beta VC11.)."

4

tôi nhận được các lỗi tương tự biên soạn với VS2010 và khắc phục nó bằng cách kế thừa từ std::unary_function:

struct IsEven : std::unary_function<int, bool> 

Tôi chỉ coi này do result xuất hiện trong thông báo lỗi. Tôi chỉ có thể đoán rằng std::ref, trong VS2010, phụ thuộc vào typedef s trong unary_function:

template <class Arg, class Result> 
    struct unary_function { 
    typedef Arg argument_type; 
    typedef Result result_type; 
    }; 

EDIT:

Xem câu trả lời từ Cheers and hth. - Alf về lỗi trong VS2010.

+0

Điều này không cần thiết nữa. Gửi một lỗi. – pmr

+0

Biên dịch với điều này một lần .. thú vị .. – Asha

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