XCode 预期非合格 id TNT(模板数字工具包)

XCode Expected unqualified-id TNT (Template Numerical Toolkit)

本文关键字:数字 工具包 TNT id XCode      更新时间:2023-10-16

在编译TNT库(即模板数值工具包)时,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标题在这里

尝试在每个模板的末尾添加分号";"不起作用:

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;
};

我正在使用

XCode5GNU++11libC++

也尝试过libstdc++

下面是

一个导致 Clang error: expected unqualified-id的最小示例(第 5 行):

#define N 
int main()
{
    int N=3;
}

因为第 5 行扩展到 int =3;(您还会遇到错误,例如 #define N 10但有一个额外的note: expanded from macro 'N')。

所以我敢打赌,您的代码在包含标头 tnt_array1d_utils.h 之前在某处定义宏N(可能在另一个标头中,这是邪恶的),这似乎是一个非常糟糕的主意(一个字母宏,在包含之前)。

(注意:它与缺少分号无关。在类定义(模板或"纯文本")之后需要分号,但在像这里这样的函数定义之后不需要分号。另外,一般来说,我建议您不要修改外部库中的标头。