Hãy xem xét mã lập trình meta mẫu đơn giản hóa sau đây, thực hiện một lớp Angle
lưu trữ bên trong giá trị giảm modulo 360 độ.Tự động + tĩnh trong đẳng cấp không đổi với sự lập trình meta
#include <iostream>
#include <typeinfo>
template<int N, int D>
struct Modulus
{
static auto const value = N % D;
};
template<int N>
struct Angle
{
static auto const value = Modulus<N, 360>::value; // ERROR
//static int const value = Modulus<N, 360>::value; // OK
//static auto const value = N % 360; // OK
typedef Angle<value> type;
};
int main()
{
std::cout << typeid(Angle<30>::type).name() << "\n";
std::cout << typeid(Angle<390>::type).name() << "\n";
return 0;
}
Output trên Ideone
Với Visual C++ 2010 Express, tôi có thể làm static auto const = Modulus<N, 360>::value
, nhưng với MinGW gcc 4.7.2 (Nuwen distro) hoặc Ideone (gcc 4.5.1) tôi phải hoặc biểu thị một cách rõ ràng nhập là static int const value = Modulus<N, 360>::value
hoặc tôi phải sử dụng auto
với cụm từ mô đun đầy đủ là static auto const value = N % 360;
.
Câu hỏi: Trình biên dịch nào chính xác theo tiêu chuẩn C++ 11 mới?
Có, trong gcc 4.5.1 hỗ trợ cho C++ 11 vẫn còn rất không đầy đủ, bạn nên kiểm tra http://gcc.gnu.org/projects/cxx0x.html để xem tính năng nào có sẵn trong phiên bản nào. –
@hvd, không chính xác. chúng phải được khai báo constexpr. –
@SegFault Tôi cũng gặp lỗi này với MinGW 4.7 – TemplateRex