简单的一点代码。到目前为止,它显然是不完整的,但它应该可以编译。我正在将它从 Visual Studio 转换为 Linux。当我使用 g++ test.cpp 编译时,出现此错误:
#ifndef _STRING_H
#define _STRING_H
#include <cstring>
#include "ArrayClass.h"
#include "Exception.h"
class String : virtual public ArrayClass<char>
{
public:
String();
String(char* s);
};
String::String() : ArrayClass<char>(1,'\0') {}
String::String(char* s) : ArrayClass<char>(std::strlen(s)+1)
{
std::strcpy(pointer_Object, s);
}
#endif
似乎我已经来回地解决了它。有任何想法吗?
用这些编译:
最佳答案
看来您已经破解了 string.h
的包含保护。
#ifndef _STRING_H
#define _STRING_H
这样做是违法的,并且不清楚你为什么这样做。
#include <cstring>
就是必需的。可能的结果是
<string.h>
被忽略,这将导致 <cstring>
期望的全局命名空间中缺少某些内容。编辑:啊,现在我明白了。您的标题也被命名为
"string.h"
。下划线开头后跟大写字母的名称保留给实现:编译器和标准库。它们可以是内部使用的运算符,也可以是内部变量(例如系统 header 的包含保护)。试试这个:
#ifndef INCLUDED_SEANS_STRING_H
#define INCLUDED_SEANS_STRING_H
由于宏都集中在一个命名空间中,因此您可以使用不与其他任何内容冲突的宏名称。有些人甚至将 UUID 放在标题守卫中;我只是提到图书馆的名字。
关于c++ - std::strcpy 未在此范围内声明 DESPITE #include <cstring>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31691168/