2009-10-27 73 views
5

我的問題是,當我想要下載庫時,我從GCC得到一些奇怪的編譯錯誤,編譯器要求糾正的代碼似乎是正確的。GCC編譯錯誤:聲明'strlen'必須可用

的錯誤都是這樣的:

Catalogue.h:96: error: there are no arguments to ‘strlen’ that depend on a template parameter, so a declaration of ‘strlen’ must be available

這裏是圍繞線96的代碼:

GaCatalogueEntry(const char* name, T* data) 
{ 
    if(name) 
    { 
     _nameLength = (int)strlen(name); // LINE 96 

     // copy name 
     _name = new char[ _nameLength + 1 ]; 
     strcpy(_name, name);  // LINE 100: similar error 

     _data = data; 

     return; 
    } 

    _name = NULL; 
    _nameLength = 0; 
    _data = NULL; 
} 

我能做些什麼來解決這些編譯錯誤?

+0

看起來你有一組名稱與'_ [a-z]。*'匹配的全局變量,這些名稱是爲實現保留的。 ('_ [a-z]。*'適用於非全局名稱,如本地變量和類成員) – MSalters 2009-10-27 09:16:38

+0

我不認爲它們是全局變量 - 而是成員變量。我猜GaCatalogueEntry是模板類中的成員函數。但是你是對的,有一個涉及下劃線前綴的命名約定是危險的。對於成員變量,最好使用m_前綴或_後綴。 – 2009-10-27 09:26:43

回答

3

該代碼是越野車。您可能錯過了#include <string.h>

如果您不想更改代碼,請將-fpermissive添加到編譯器選項。 (請參閱GCC documentation。)

10

您可能只需包含包含strcpy和strlen庫函數的頭文件。

#include <string.h> 

或(優選爲C++)

#include <cstring> 
+1

好多了! (你必須使用std :: strlen()而不是strlen)。 – Ben 2009-10-27 09:23:28

4

在C++ strlen的()函數是字符串庫的一部分,它幾乎看起來是不包括頭文件。

它包含在任何地方嗎?

include <string.h> 

如果不是,請嘗試添加它,看看是否解決了問題。

+0

是的,問題是缺少頭文件。但我認爲錯誤消息不像java等語言那樣領先。 – Navid 2009-10-27 09:16:03

+1

在這種情況下,由於代碼是模板的一部分,導致錯誤的原因受到某種程度的混淆。編譯器在模板中發現了一個未識別的符號,如果未識別的符號依賴於模板參數T,它甚至不會導致錯誤,直到模板實際實例化爲止(例如,如果符號類似於T :: dosomething( )) – 2009-10-27 09:21:35

1

a declaration of ‘strlen’ must be available

包括string.h<cstring>用於strlen()聲明(C++)。