2015-07-29 15 views
23

SSCCE của vấn đề của tôi là:lớp Nested mẫu với con trỏ-to-phương pháp không được biên dịch trong vang ++

template <class T> class MyClass 
{ 
    template <void (MyClass::*M)() const> struct wrapper 
    { 
    virtual void call(); 
    }; 
}; 

template <typename T> 
template <void (MyClass<T>::*M)() const> 
void MyClass<T>::wrapper<M>::call() 
{ 
} 

Mã này được biên soạn trong gcc nhưng thất bại với lỗi:

error: nested name specifier 'MyClass<T>::wrapper<M>::' for declaration does not refer into a class, class template or class template partial specialization 
void MyClass<T>::wrapper<M>::call() 
~~~~~~~~~~~~~~~~~~~~~~~~~^ 

trong vang ++. Tại sao?

Trong lớp học gọi định nghĩa giải quyết được sự cố, tôi biết. Bất kỳ mẫu không trỏ tới phương thức nào cũng hoạt động tốt ở mọi nơi. Thử nghiệm với mẫu/tên tệp không có kết quả.

+0

Dường như không ai trên SO biết câu trả lời, vì vậy có thể bạn có thể gửi lỗi Clang và sau đó đăng ở đây nếu bạn nhận được phản hồi. – Brian

+2

@Brian, OK. https://llvm.org/bugs/show_bug.cgi?id=24357 Đang chờ ... – dyomas

+4

SSCCE của bạn thiếu các công tắc dòng lệnh và số phiên bản. – kfsone

Trả lời

-2

Bạn có thể chuyển việc thực hiện các phương pháp trong định nghĩa lớp:

template <class T> class MyClass 
{ 
    template <void (MyClass::*M)() const> struct wrapper 
    { 
     virtual void call(){/* move implementation here */}; 
    }; 
}; 
+1

Xem ở trên: _Trong định nghĩa cuộc gọi lớp giải quyết được sự cố, tôi biết_ – dyomas

1

thể workaround: xem xét sử dụng std :: chức năng thay vì wrapper. Nó không hoàn toàn giống nhau (ít ràng buộc hơn về các con trỏ hàm nào được chấp nhận) nhưng nó sẽ biên dịch trên clang ++ và đơn giản hóa mã của bạn.

#include <functional> 

template <class T> class MyClass 
{ 
    typedef std::function<void(void) const > wrapper; 
}; 
Các vấn đề liên quan