2012-02-21 36 views
5

Khi sử dụng cú pháp khai báo hàm mới và decltype, cách truy cập thành viên? Dường như this không thể truy cập:C++ Truy cập điều này trong Cú pháp khai báo hàm mới

template <typename Func> 
struct context_binder 
{ 
public: 
    context_binder(const Func& func) : 
      func(func) 
    { } 

    template <typename... TArgs> 
    auto operator()(TArgs&&... args) const 
      -> decltype(this->func(std::forward<TArgs>(args)...)) 
    { 
     return func(std::forward<TArgs>(args)...); 
    } 
private: 
    Func func; 
}; 

này mang lại các lỗi biên dịch:

scratch.cpp:34:25: error: invalid use of ‘this’ at top level 

trình biên dịch của tôi là g++ 4.6.2.


workaround của tôi là để khai báo một thành viên tĩnh gọi self với các loại tương tự như lớp, trong đó có hai vấn đề:

  1. Nó sẽ không nhặt CV-vòng tự động, giống như this sẽ .
  2. Tôi phải di chuyển các khai báo thành viên lên trên việc sử dụng decltype hoặc không thể nhìn thấy thành viên (mặc dù điều đó có vẻ giống như lỗi trình biên dịch).

Trả lời

3

Nâng cấp lên GCC 4.7. Phiên bản 4.6 không hỗ trợ this nơi bạn đang cố gắng sử dụng.

Another question bao gồm một số cách giải quyết bạn có thể sử dụng.

+1

Tôi rất vui vì điều này khiến tôi đặt câu hỏi về sự tự tin của mình trong khả năng đọc tài liệu chuẩn. –

+0

@TravisGockel: Nói chung, bạn nên giả định rằng nếu bạn đọc tài liệu chuẩn xung đột với GCC (hoặc bất kỳ trình biên dịch tại thời điểm này), nó có nhiều khả năng là trình biên dịch hơn đọc hiểu của bạn. –

2

Bạn có hai lỗi. Một lỗi là những gì bạn phát hiện chính mình. Lỗi khác là bạn cố truy cập thành viên trước khi nó được khai báo. Khai báo nó trước khi bạn sử dụng nó (lưu ý rằng kiểu trả về, ngay cả khi nó được chỉ định theo cách sau, không thể truy cập vào các thành viên mà bạn khai báo sau này, không giống như phần thân hàm).

template <typename Func> 
struct context_binder 
{ 
private: 
    Func func; 

public: 
    context_binder(const Func& func) : 
      func(func) 
    { } 

    template <typename... TArgs> 
    auto operator()(TArgs&&... args) const 
      -> decltype(this->func(std::forward<TArgs>(args)...)) 
    { 
     return func(std::forward<TArgs>(args)...); 
    } 
}; 

Vì vậy, các 2) mà bạn hạn như một nhược điểm của cách giải quyết của bạn không phải là thực sự là một trở ngại vì cách thực mã này vẫn cần các thành viên được công bố trước khi bạn sử dụng nó.

+0

Điểm rất tốt. Nó chỉ ra việc giảm 'this->' và chỉ sử dụng 'func' làm việc nếu tôi di chuyển khai báo' func' cao hơn. –

+0

@Travis tôi không nghĩ rằng nó "hoạt động" theo cách bạn muốn bởi vì "const" không được tôn trọng theo cách đó (trước khi thay đổi trong giấy làm việc "này" được cho phép và được sử dụng ngầm ngay cả khi không được sử dụng một cách rõ ràng). "Điều này" không được phép không liên quan đến khả năng tham chiếu đến các thành viên dữ liệu không tĩnh trong một "decltype". Ví dụ: bạn có thể nói từ "chính": "decltype (context_binder :: func())", nếu "func" là "công khai" và sẽ chấp nhận cuộc gọi với 0 đối số. Trong sử dụng đó, "context_binder :: func" có loại "Func", không phải "Func const". –

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