Tôi đã viết một số mã một lần trên một thời gian tạo ra một bảng/mảng tĩnh tại thời gian biên dịch cho một số mẫu lập trình meta (ý tưởng là các chuỗi kiểu C có thể được xây dựng tại thời gian biên dịch (chúng chỉ là char
mảng)). Ý tưởng và mã dựa tắt David Lin 's answer:Tạo bảng tĩnh hoạt động với GCC nhưng không hoạt động; là kêu vang?
#include <iostream>
const int ARRAY_SIZE = 5;
template <int N, int I=N-1>
class Table : public Table<N, I-1>
{
public:
static const int dummy;
};
template <int N>
class Table<N, 0>
{
public:
static const int dummy;
static int array[N];
};
template <int N, int I>
const int Table<N, I>::dummy = Table<N, 0>::array[I] = I*I + 0*Table<N, I-1>::dummy;
template <int N>
int Table<N, 0>::array[N];
template class Table<ARRAY_SIZE>;
int main(int, char**)
{
const int *compilerFilledArray = Table<ARRAY_SIZE>::array;
for (int i=0; i < ARRAY_SIZE; ++i)
std::cout<<compilerFilledArray[i]<<std::endl;
}
Biên dịch mã này với GCC 4.9.2 công trình:
Clang 3.5 phàn nàn, mặc dù:
$ clang++ -Wall -pedantic b.cpp
Undefined symbols for architecture x86_64:
"Table<5, 0>::dummy", referenced from:
___cxx_global_var_init in b-b8a447.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
dummy
và array
đều được đưa ra định nghĩa bên ngoài lớp Table
(nơi chúng được khai báo). Theo như tôi có thể nói, điều này sẽ đáp ứng các yêu cầu của trình liên kết.
Đây có phải là lỗi với tiếng kêu không?
Ah, điều đó có ý nghĩa! Đó là một sự xấu hổ tôi chỉ có thể bỏ phiếu một lần. Ngoài ra, tôi đang mong chờ các báo giá tiêu chuẩn khi bạn nhận được chúng. – Cornstalks
@Cornstalks Họ đang ở đó :) – Columbo
Bạn có thể thêm liên kết đến báo cáo lỗi gcc không? –