2010-12-29 51 views
7

Mã sau sẽ không biên dịch. Trình biên dịch phàn nàn về * không có hàm phù hợp để gọi for_each *. Tại sao cái này rất?Tại sao không thể cấu trúc được định nghĩa bên trong một hàm được sử dụng như hàm functor thành std :: for_each?

#include <map> 
#include <algorithm> 

struct Element 
{ 
    void flip() {} 
}; 

void flip_all(std::map<Element*, Element*> input) 
{ 
    struct FlipFunctor 
    { 
     void operator() (std::pair<Element* const, Element*>& item) 
     { 
      item.second->flip(); 
     } 
    }; 

    std::for_each(input.begin(), input.end(), FlipFunctor()); 
} 

Khi tôi di chuyển struct FlipFunctor trước khi chức năng flip_all, mã biên dịch.

thông báo lỗi đầy đủ:

no matching function for call to ‘for_each(std::_Rb_tree_iterator<std::pair<Element* const, Element*> >, std::_Rb_tree_iterator<std::pair<Element* const, Element*> >, flip_all(std::map<Element*, Element*, std::less<Element*>, std::allocator<std::pair<Element* const, Element*> > >)::FlipFunctor)’

Trả lời

13

std::for_each là mẫu chức năng; một trong các tham số mẫu là kiểu đối số hàm.

Bạn không thể sử dụng loại địa phương làm đối số mẫu. Nó chỉ là một hạn chế hiện tại trong ngôn ngữ. Trong bản sửa đổi sắp tới của C++, C++ 0x, hạn chế này bị loại bỏ, vì vậy bạn có thể sử dụng các kiểu cục bộ làm đối số mẫu.

Visual C++ 2010 đã hỗ trợ việc sử dụng các lớp địa phương làm đối số mẫu; hỗ trợ trong các trình biên dịch khác có thể khác nhau. Tôi đoán rằng bất kỳ trình biên dịch hỗ trợ C++ 0x lambdas cũng sẽ hỗ trợ việc sử dụng các lớp địa phương như các đối số mẫu (điều này có thể không hoàn toàn đúng, nhưng nó sẽ có ý nghĩa).

+2

C++ 03: * Gần như * cho phép bạn định nghĩa thuận tiện các trình đặc biệt quảng cáo gần các điểm sử dụng của chúng. :-P –

0

tôi nhận được một lỗi khác nhau khi tôi cố gắng để biên dịch mã của bạn:

error: 'flip_all(__gnu_debug_def::map, std::allocator > >)::FlipFunctor' uses local type 'flip_all(__gnu_debug_def::map, std::allocator > >)::FlipFunctor'

Đó là thực sự được mong đợi, bởi vì một loại chức năng địa phương (ví dụ như của bạn FlipFunctor ở đây) có liên kết nội bộ và loại mẫu phải có liên kết bên ngoài. Vì tham số thứ ba của tiêu chuẩn :: for_each một mẫu, bạn không thể chuyển một thứ gì đó của một loại hàm cục bộ cho nó.

+2

Các lớp học địa phương không có liên kết nội bộ; họ không có liên kết. –

+0

Thông báo lỗi tốt hơn rất nhiều so với tôi. Đây có phải là gcc 4.5 không? – Oswald

+0

@Oswald: Không, đó là GCC 4.0, trên Mac OS X. –

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