前置声明
本帖最后由 stevenmtroy 于 2020-3-19 21:55 编辑在头文件中,为什么在类A中这样定义字符串类s,编译器会报错:不允许使用不完整的类型
extern class string;
class A {
private:
string s;
};
而直接这样定义编译器就不会报错:
extern class string;
string s;
另外,第一种情况的解决方法除了将iostream、string包含进来,还有别的办法吗?
请说明你学的是纯C还是c++ 本帖最后由 stevenmtroy 于 2020-3-19 23:05 编辑
bin554385863 发表于 2020-3-19 22:38
请说明你学的是纯C还是c++
先学的纯C,然后继续学的C++,这个问题应该是偏向于C++的。 stevenmtroy 发表于 2020-3-19 23:03
先学的纯C,然后继续学的C++,这个问题应该是偏向于C++的。
完整代码发出来 本帖最后由 stevenmtroy 于 2020-3-20 00:01 编辑
bin554385863 发表于 2020-3-19 23:24
完整代码发出来
就是这一段,定义在一个头文件A.h中,
extern class string;
class A
{
private:
string s;
};
然后,主程序:
# include<iostream>
# include<string>
int main(void)
{
A myclass;
return 0;
}
头文件在编译时会报错:不允许使用不完整的类型 stevenmtroy 发表于 2020-3-19 23:59
就是这一段,定义在一个头文件A.h中,
extern class string;
你extern class string;是怎么来的?c++本身就有string类, bin554385863 发表于 2020-3-20 00:04
你extern class string;是怎么来的?c++本身就有string类,
string.h中就有这个系统已经定义好的类 在头文件的后面加上using std::string; 试试 梦想灬远帆 发表于 2020-3-20 09:03
在头文件的后面加上using std::string; 试试
如果不把头文件string包含进去,直接写using std::string不行,会报错:namespace "std"中没有成员“string” stevenmtroy 发表于 2020-3-20 00:05
string.h中就有这个系统已经定义好的类
那你直接include<string.h>就好了,况且string.h就是string的旧版本 bin554385863 发表于 2020-3-20 12:14
那你直接include就好了,况且string.h就是string的旧版本
这个我知道可以用# include<string>解决,但是一般在多文件写代码时不推荐在头文件中包含其他的头文件,容易导致重复包含,所以就想知道有没有更好的办法。 本帖最后由 bin554385863 于 2020-3-20 21:52 编辑
stevenmtroy 发表于 2020-3-20 20:52
这个我知道可以用# include解决,但是一般在多文件写代码时不推荐在头文件中包含其他的头文件,容易导致 ...
你是怎么学习的预编译?包含防护都不知道?
C/C++的标准库头文件都有包含防护
看看这个
https://www.cnblogs.com/yyxt/p/4253776.html
你自己写头文件的时候也要写包含防护
页:
[1]