Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 名称空间错误_C++_Struct_Namespaces_Header Files - Fatal编程技术网

C++ 名称空间错误

C++ 名称空间错误,c++,struct,namespaces,header-files,C++,Struct,Namespaces,Header Files,嗨,我正在课堂上做作业,以熟悉名称空间的使用。我得到了一些不同的错误,虽然我不知道为什么,因为我已经在其他4个头文件和.cpp文件中完成了相同的过程,没有错误,所以我被难住了。错误是: WriteFile.cpp: In function 'void WriteLine(CSC2100::WriteFile*, CSC2100::String*)': WriteFile.cpp:39:27: error: invalid use of incomplete type 'struct CSC210

嗨,我正在课堂上做作业,以熟悉名称空间的使用。我得到了一些不同的错误,虽然我不知道为什么,因为我已经在其他4个头文件和.cpp文件中完成了相同的过程,没有错误,所以我被难住了。错误是:

WriteFile.cpp: In function 'void WriteLine(CSC2100::WriteFile*, CSC2100::String*)':
WriteFile.cpp:39:27: error: invalid use of incomplete type 'struct CSC2100::String'
In file included from WriteFile.h:4:0,
                 from WriteFile.cpp:1;
String.h:6:11: error: forward declaration of 'struct CSC2100::String'
WriteFile.cpp:41:30: error: invalid use of incomplete type 'struct CSC2100::String'
In file included from WriteFile.h:4:0,
                 from Writefile.cpp:1:
String.h:6:11: error: forward declaration of 'struct CSC 2100::String'
我已经彻底检查了错误中提到的代码,似乎找不到问题。我在WriteFile.cpp的顶部包含了转发声明以及错误所在的函数:

#include "WriteFile.h"
namespace CSC2100
{
   struct WriteFile
   {
      ofstream output_file;
      bool closed;
   };
}
#include <sstream>
using namespace CSC2100;
///////////////////////////////////////////
void writeLine(WriteFile* wf, String* line)
{
   if (!wf->closed && line->sz > 0)
   {
      wf->output_file << line->text << endl;
   }
}
和字符串。h:

#if !defined STRING_STRUCT
#define STRING_STRUCT

namespace CSC2100
{
   struct String;
}

CSC2100::String* createString(const char* char_array);
void displayString(CSC2100::String* str);
void destroyString(CSC2100::String* str);
int length(CSC2100::String* str);
const char* getText(CSC2100::String* str);
int a_to_i(CSC2100::String* str);
float a_to_f(CSC2100::String* str);
CSC2100::String* i_to_a(int number);
CSC2100::String* f_to_a(float number);
int find(CSC2100::String* str, char delimiter, int start);
CSC2100::String* substr(CSC2100::String* str, int start, int end);
int compare(CSC2100::String* str1, CSC2100::String* str2);
教授写的代码应该都是正确的。我们所做的只是对其应用名称空间。感谢您的帮助。

此代码

namespace CSC2100 {
   struct String {
       const char* text;
       int sz; 
   };
}
当然应该把gp改为String.h而不是String.cpp

另见:

对于WriteFile.h,请尝试不包括String.h:

#if !defined STRING_STRUCT
#define STRING_STRUCT

namespace CSC2100
{
   struct String;
}

CSC2100::String* createString(const char* char_array);
void displayString(CSC2100::String* str);
void destroyString(CSC2100::String* str);
int length(CSC2100::String* str);
const char* getText(CSC2100::String* str);
int a_to_i(CSC2100::String* str);
float a_to_f(CSC2100::String* str);
CSC2100::String* i_to_a(int number);
CSC2100::String* f_to_a(float number);
int find(CSC2100::String* str, char delimiter, int start);
CSC2100::String* substr(CSC2100::String* str, int start, int end);
int compare(CSC2100::String* str1, CSC2100::String* str2);
并在WriteFile.cpp中包含String.h


您必须使用前向声明类声明,无论这些声明是否位于特定的命名空间中,以解决此类循环引用。

您的教授做得很好!您已经错过了在这个名称空间中定义他要求的方法!OT或者:缺乏足够的信息,不清楚你在问什么@πάνταῥεῖ 对不起,我不明白你的评论。缺少在名称空间中定义他要求的方法是什么意思?首先,不应该在头文件中使用名称空间std。其次,您的帖子有点不清楚-您对CSC2100:String的定义是在标题中还是在cpp文件中?您需要在头文件中包含整个定义,以便包含它的内容知道它应该如何工作。不要包含.cpp文件。。将结构的整个声明放在标题中。为什么要向前声明结构?@user3558697您必须将结构的完整定义放在标题中。否则WriteFile.cpp将如何知道CSC2100::String的成员是什么?当你说line->text时,编译器不知道你在说什么,因为你没有告诉它text是CSC2100::Strings的成员,所以有一些缺陷,你没有在问题中解释。您了解我对转发类声明的担忧了吗?您可能无法在头文件中使用这些文件内联代码,请将它们移动到.cpp!我找不到我的错误。我已经把实验室交给教授了,也许他能找到。谢谢你的帮助though@user3558697如果我是你的教授,我会拒绝进一步的建议,让你回到起点。。。
namespace CSC2100 {
   struct String {
       const char* text;
       int sz; 
   };
}
 #include <fstream>

 // #include "String.h" **** OMIT THIS ****
 namespace CSC2100 {
     class String;
 }

 // ...