在编译TNT library即模板数字工具包时,XCode会引发此错误:
tnt/tnt_array1d_utils.h:33:9: Expected unqualified-id
受影响的代码段:
namespace TNT
{
template <class T>
std::ostream& operator<<(std::ostream &s, const Array1D<T> &A)
{
int N=A.dim1(); /// <--- this line 33:9
#ifdef TNT_DEBUG
s << "addr: " << (void *) &A[0] << "\n";
#endif
s << N << "\n";
for (int j=0; j<N; j++)
{
s << A[j] << "\n";
}
s << "\n";
return s;
}
整个TNT标题here
试图添加一个分号“;”到每个模板的末尾都不起作用:
namespace TNT
{
template <class T>
std::ostream& operator<<(std::ostream &s, const Array3D<T> &A)
{
int M=A.dim1();
int N=A.dim2();
int K=A.dim3();
s << M << " " << N << " " << K << "\n";
for (int i=0; i<M; i++)
{
for (int j=0; j<N; j++)
{
for (int k=0; k<K; k++)
s << A[i][j][k] << " ";
s << "\n";
}
s << "\n";
}
return s;
};
我正在使用
XCode5 GNU + 11 的libC ++
也试过 的libstdc ++
答案 0 :(得分:1)
以下是导致error: expected unqualified-id
与Clang(第5行)的最小示例:
#define N
int main()
{
int N=3;
}
因为第5行已扩展为int =3;
(您还会收到错误,例如#define N 10
,但附加note: expanded from macro 'N'
。
所以我敢打赌你的代码在包含标题tnt_array1d_utils.h之前的某个地方定义了一个宏N
(可能在另一个标题中,这是邪恶的),这似乎是一个非常糟糕的主意(单字母宏,之前包括)。
(注意:它与缺少分号无关。在类定义(模板或“普通”)之后需要分号,但在此处的函数定义之后不需要分号。另外,一般来说,我建议你不要使用分号。 t修改外部库中的标题。)