C++ GCC编译错误:声明‘;斯特伦&x2019;必须是可用的

C++ GCC编译错误:声明‘;斯特伦&x2019;必须是可用的,c++,gcc,compiler-errors,C++,Gcc,Compiler Errors,我的问题是,当我想制作一个下载的库时,我会从中得到一些奇怪的编译错误,而编译器要求更正的代码似乎就是正确的 错误都是这样的: 目录h:96:错误:没有 依赖于 模板参数,所以是一个声明 “strlen”的名称必须可用 以下是第96行的代码: GaCatalogueEntry(const char* name, T* data) { if( name ) { _nameLength = (int)strlen( name ); // LINE 96

我的问题是,当我想制作一个下载的库时,我会从中得到一些奇怪的编译错误,而编译器要求更正的代码似乎就是正确的

错误都是这样的:

目录h:96:错误:没有 依赖于 模板参数,所以是一个声明 “strlen”的名称必须可用

以下是第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;
}

如何修复这些编译错误?

代码有缺陷。您可能缺少一个
#include


如果不想更改代码,请将
-fppermissive
添加到编译器选项中。(请参阅。)

您可能只需要包含包含strcpy和strlen库函数的标题

#include <string.h>
#包括
或者(最好是C++)

#包括
在C++中,String()函数是字符串库的一部分,它看起来几乎不包括头文件。

包括在任何地方吗

include <string.h>
包括
如果没有,请尝试添加它,看看是否可以解决问题

必须提供“strlen”声明


包含
string.h
(C++)以声明
strlen()

是,问题是缺少头文件。但是我认为错误消息并不像java这样的语言那么重要。在本例中,由于代码是模板的一部分,导致错误的原因有些模糊。编译器在模板中发现了一个未识别的符号,如果未识别的符号依赖于模板参数t(例如,如果该符号类似于t::dosomething()),则在模板实际实例化之前,该符号甚至不会导致错误。似乎您有一组名称匹配的全局变量.*
,这些名称是为实现保留的。(
.[a-z].
适用于局部变量和类成员等非全局名称)我认为它们不是全局变量,而是成员变量。我猜gacataloteentry是模板类中的一个成员函数。但你是对的,使用包含下划线前缀的命名约定是危险的。对于成员变量,最好使用m_u前缀或u后缀。更好!(您必须使用std::strlen()而不仅仅是strlen)。
include <string.h>