2009-10-27 74 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++)。