2012-10-11 16 views
6

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?

+0

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

+0

@hvd, không chính xác. chúng phải được khai báo constexpr. –

+0

@SegFault Tôi cũng gặp lỗi này với MinGW 4.7 – TemplateRex

Trả lời

1

Mã hợp lệ. Visual C++ là đúng để chấp nhận nó và gcc là sai để từ chối nó (cho đầy đủ, Clang 3.1 cũng chấp nhận mã). Các đặc điểm kỹ thuật khẳng định rằng (C++ 11 7.1.6.4 [dcl.spec.auto]/4):

các autotype-specifier cũng có thể được sử dụng ... trong tuyên bố một thành viên dữ liệu tĩnh với a bộ khởi tạo dấu ngoặc đơn hoặc bằng nhau xuất hiện trong thông số thành viên đặc điểm kỹ thuật của định nghĩa lớp học.

value là thành viên dữ liệu tĩnh. Nó có brace-hoặc-equal-initializer (đó là phần = Modulus<N, 360>::value của khai báo), và initializer xuất hiện trong số thành viên đặc điểm kỹ thuật của định nghĩa lớp (tức là, đó là những gì con người có thể gọi là "inline initializer ").

+0

+1 và được chấp nhận. Cảm ơn rất nhiều! Cách thích hợp nhất để gửi báo cáo lỗi là gì? – TemplateRex

+0

@rhalbersma: GCC có [cơ sở dữ liệu Bugzilla] (http://gcc.gnu.org/bugzilla/). Tuy nhiên, tôi không quen thuộc với các thủ tục báo cáo lỗi của họ. Tôi khuyên bạn nên tìm kiếm trước để xem liệu điều này đã được báo cáo chưa. –

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