Tôi có đoạn mã sau:Non-kiểu mẫu lập luận không phải là một biểu thức hằng
#include <cstdlib>
#include <cstdio>
#include <atomic>
enum ATYPE { Undefined = 0, typeA, typeB, typeC };
template<ATYPE TYPE = Undefined>
struct Object
{
Object() { counter++; }
static std::atomic<int> counter;
};
template<ATYPE TYPE>
std::atomic<int> Object<TYPE>::counter(1);
template<ATYPE TYPE>
void test()
{
printf("in test\n");
Object<TYPE> o;
}
int main(int argc, char **argv)
{
test<typeA>();
printf("%d\n", Object<typeA>::counter.load());
Object<typeA>::counter.store(0);
for (int i = 0; i < sizeof(ATYPE); ++i) {
Object<static_cast<ATYPE>(i)>::counter.store(0);
}
return 0;
}
Khi tôi biên dịch với các dòng lệnh sau:
clang++ -o test -std=c++11 -stdlib=libc++ test.cpp
tôi nhận được các lỗi sau đây:
test.cpp:32:20: error: non-type template argument is not a constant expression
Object<static_cast<ATYPE>(i)>::counter.store(0);
^~~~~~~~~~~~~~~~~~~~~
test.cpp:32:39: note: read of non-const variable 'i' is not allowed in a constant expression
Object<static_cast<ATYPE>(i)>::counter.store(0);
^
testray.cpp:31:18: note: declared here
for (int i = 0; i < sizeof(ATYPE); ++i) {
Tôi hiểu vấn đề tôi tin. Đối số của mẫu cần phải là một constexpr và tôi rõ ràng là không. Vì vậy, câu hỏi là, họ có thể thay đổi tôi có thể làm để có được điều này làm việc. Bằng cách làm việc này, ý tôi là, tôi có thể bằng cách nào đó có một cách tốt hơn để thiết lập lại các quầy tĩnh từ mẫu này lớp đối với từng loại trong ATYPE, khác hơn là chỉ làm nó bằng tay:
Object<Undefined>::counter.store(0);
Object<typeA>::counter.store(0);
...
Mà không phải là quá thanh lịch và thiết thực khi ATYPE chứa nhiều loại.
Cảm ơn rất nhiều sự giúp đỡ và lời khuyên của bạn.
Bạn đang lặp lại lỗi enum của mình. 'i' không phải là một biểu thức liên tục hoặc là lỗi hiển thị. – Rapptz
@Rapptz, bạn có thể vui lòng cụ thể hơn về bình luận đầu tiên của bạn (lặp lại thông qua enum sai). Tôi biết tôi không phải là const, vì vậy đó là lý do tại sao tôi hỏi nếu bằng cách nào đó là một cách để làm công việc này. Có cách nào đó một cách lặp lại trên tất cả các yếu tố của enum và đặt lại các quầy? cảm ơn bạn. – user18490
Điều Rapptz có nghĩa là tôi năng động và không thể được sử dụng như một đối số mẫu biên dịch thời gian –