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
).
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
@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. –