2012-02-20 36 views
13

Tại sao một lớp học không có một số decltype trong danh sách thừa kế? Ví dụ, tôi mong chờ các mã sau đây để làm A<B> kế thừa từ RType, nhưng với G ++ 4.6.1 (sử dụng -std=c++0x) nó không biên dịch:Tại sao một lớp không thể kế thừa từ kết quả của một decltype?

#include <type_traits> 

template<typename T> 
class A : public decltype(std::declval<T>().hello()) { }; 

class RType { }; 

class B { 
public: 
    RType hello() { return RType(); } 
}; 

int main() { 
    A<B> a; 
} 

Nó cung cấp cho đầu ra sau đây:

test.cpp:6:18: error: expected class-name before 'decltype' 
test.cpp:6:18: error: expected '{' before 'decltype' 
test.cpp:6:54: error: expected unqualified-id before '{' token 
test.cpp: In function 'int main()': 
test.cpp:16:7: error: aggregate 'A<B> a' has incomplete type and cannot be defined 

Việc sử dụng declval chỉ để cung cấp một trường hợp bạn cần sử dụng decltype, nhưng các cách sử dụng khác của decltype cũng không thành công (nghĩa là, không có declval).

+3

Bạn đã thử dùng gcc 4.7, clang hay bất kỳ trình biên dịch nào khác không? gcc không hoàn toàn tương thích với C++ 11 ... – PlasmaHH

+1

@PlasmaHH Tôi đang thực sự cố gắng biên dịch tiếng kêu bây giờ (vì các lý do khác) nhưng với MSVC++ 2010 nó không hoạt động. –

Trả lời

19

Nó cho phép:

10.1: "Một danh sách các lớp cơ sở có thể được quy định trong một định nghĩa lớp sử dụng các ký hiệu:"

class-or-decltype: 
nested-name-specifieropt class-name 
decltype-specifier 

vì vậy tôi đoán trình biên dịch của bạn có lỗi

+0

Eclipse CDT cũng báo cáo đây là lỗi cú pháp nhưng trên thực tế, nó biên dịch. – WorldSEnder

3

Một workaround:

template <typename T> 
class ID 
{ 
public: 
    typedef T type; 
}; 

template<typename T> 
class A : public ID<whatever>::type { }; 
+0

Lưu ý rằng tôi đang kế thừa từ loại đó là kiểu trả về của một hàm. Điều này không/không thể làm điều tương tự. –

+3

@Seth: Tôi nghĩ rằng hàm ý là thử 'template lớp A: ID công khai () .hello())> :: type {}; '. – ildjarn

+0

@ildjarn có lẽ bạn đã đúng, không nghĩ đủ xa –

-2

Bạn có thể thử một cái gì đó như

template<typename T> 
class A : public result_of<T::hello()> 

mặc dù nó có thể mong đợi chức năng thành viên tĩnh cho cú pháp đó và có khả năng sẽ chạy cùng một lỗi ngăn chặn từ chối hoạt động.

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