2013-10-21 61 views
0

當編譯TNT library即模板數值工具包,XCode中引發此錯誤:的XCode預期不合格-ID TNT(模板數值工具包)

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

我在某處找到了有關添加機箱和;問題在C++模板上。我做到了,但沒有結果。 – loretoparisi

回答

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,這似乎是一個非常糟糕的主意(單字母宏, )。 (注意:它與分號無關,在類定義之後需要分號(模板或「普通」),但不需要像這裏那樣的函數定義。另外,一般來說,我建議你不要使用分號不要修改來自外部庫的頭文件。)

+0

所以你的意思是這是Template Numerical Toolkit本身的語義錯誤,對嗎?在這種情況下,我無法修改庫。 http://math.nist.gov/tnt/ – loretoparisi

+1

這將是令人驚訝的。一個快速的'grep'在頭文件中定義N「'只給出一個'#define NULL 0'(tnt_i_refvec.h,第33行)。可能「#define N [something]'」是您項目的另一部分(我建議您嘗試進行文本搜索)。 –

+0

該項目是這一個:http://github.com/loretoparisi/EssentiaTouch – loretoparisi