赞
踩
目录
1.1 error: no matching function for call to
1.2 'xxxx' was not declared in this scope
1.3 ambiguous overload for 'operator='
1.4 crosses initialization of 或 error: jump to case label [-fpermissive]
1.6 error: redefinition of ‘class xxx’
1.7 ‘xxx’is already declared in this scope
1.8 multiple definition of ‘xxx’
1.10 `error: invalid use of incomplete type`
1.11 invalid use of incomplete type
1.12 error: ‘XXX‘ was not declared in this scope
1.13 error has not been declared
1.14 base operand of '->' has non-pointer type 'const Comple
1.15 void value not ignored as it ought to be
1.16 jump to case label [-fpermissive]
1.17 error: ‘XXX‘ is not captured
1.18 error: ‘this’ was not captured for this lambda function
1.19 错误:将‘const char*’赋值给‘char [1024]’时类型不兼容
1.20 marked override, but does not override
2.3 error adding symbols: File in wrong format
没有匹配的函数
'xxxx' 在这个范围内没有声明
重载不明确
字面意思:交叉初始化
switch的case中有定义变量,即case中不能定义变量;
或明确case 变量的作用域,用{}明确。
问题原因,继承类中没有实现纯虚函数。
头文件被同一个文件多次包含,需要加宏定义限制
- #ifndef _TEST_H_
- #define _TEST_H_
-
- //。。。
-
- #endif
把上面的代码加在头文件.h的头尾,即可避免重复定义的错误。
已在此作用域内声明
多次定义 ‘xxx’
- class A
- {
- public:
- B *b;
- };
- class B{
- public:
- A *a;
- };
- int main()
- {
- return 0;
- }
报错为“error: ‘B’ does not name a type”,就是因为在A类中使用B *b之前没有声明或定义B类,如果在第一行加上一句前置声明(forward declaration)“class B;”,就不会有这样的问题了。
编译器不知道所用的struct 或者是class的具体实现。
分析:通常出现在如下情况:假设我们有一个class some定义在some.h中,实现在some.cpp中,我们在other.cpp中要用到这个some 的方法,于是我们再other.h中声明可一个class some,并声明了要用到的方法,这样就会导致上述的问题,
解决:在other.cpp中include some.h,这样编译器就会根据该头文件找到class some的具体定义,问题也就解决了。
具体情况:
1.忘了定义头文件
2.没有引用头文件
情况一:
出现错误的情况:
class A :
定义在A.h
实现在A.cpp
由于要使用A类里的方法,在B.h中声明了 class A;
编译器找不到A的具体实现
在B.cpp中 include A.h
情况二:
- class cat;
-
- struct dog {
- cat *point;
-
- friend bool operator<(const dog &a, const dog &b) {
- cat *cat_a = a.point;
- cat *cat_b = b.point;
- return cat_a->age < cat_b->age;
- }
- }
-
- class cat {
- public:
- int age;
- }
报错的原因大概是cat向前声明,但是编译器在运行friend bool operator<(const dog &a, const dog &b) 时暂时还不知道cat的具体实现方式,所以无法获得变量age的值。
错误:在作用域内,未声明’XXX’
(1)作用域不正确。
在超出变量和函数的作用域部分使用了该变量或函数。这时候得通过定义位置,要么增加声明的手段,加大变量的作用域使其包含引用位置。
(2)头文件相互包含。
在自己写项目头文件时,两个头文件相互包含(即相互#include
),构成递归包含结构。
(3).cc 文件中,声明类
class 类名;
重复声明
->操作符前面的操作数类型不是指针类型
函数(&对象)
{
对象名.成员 //正确方式
对象名->成员 //编译报错 base operand of '->' has non-pointer type .......
}
引用传递的参数应该理解为对象,而不是指针
原因是因为,一个函数的返回值为void,但是你又把这个函数的返回值赋值给了一个具体类型的变量。
只要case中带变量不带括号,编译器都会报错,case 语句分支 加上 {}
C++ 出现 is not captured 错误原因是 未将参数添加到lamda函数 捕捉列表[]中
[=]
按值捕获所有能捕获的变量:也可以捕获this
指针
使用 [&]
按引用捕获所有能捕获的变量,也可以将其他变量单独按值捕获,例如:[&, param1, param2]
如果不使用=
来捕捉,必须将this传进Lambda表达式中
修改方法
- char testArray[1024];
- string testStr = "hello";
-
- std::strcpy(testArray, testStr.c_str);
c++11中引入了override关键字,被override修饰的函数其派生类必须重载。
派生类如果使用override,则基类函数需要确保添加了virtual
- class Object
- {
- public:
- Object(){};
- virtual ~Object(){};
-
- virtual void fun() override
- {
- std::cout << "Object::fun" << std::endl;
- }
- };
-
- class Base:public Object
- {
- public:
- Base(){};
- virtual ~Base(){};
-
- void fun();
- };
- void Base::fun()
- {
- std::cout << "Base::fun" << std::endl;
- }
-
- int main(){
- Object* b = new Base;
- b->fun();
- return 0;
- }
const static 和 static const一样,都不能在类内直接初始化非整形常量,可以修饰int,bool,char,但不能修饰其他类型(如double,float)
在c++11中,可以使用 constexpr static 或者 static constexpr 来修饰 非整形静态成员常量。
修改方法:
使用 constexpr static 修饰。
原因一:
问题关键是:在同一个文件里写了函数声明和定义,该文件被多个文件包含,造成函数的重定义。即因为一个.h文件被2个.cpp包含, .cpp都是单独编译成.o文件的,所以会出现错误
当多个文件包含同一个头文件时,而头文件中没有加上条件编译,就会独立的解释,然后生成每个文件生成独立的标示符。在编译器连接时,就会将工程中所有的符号整合在一起,由于,文件中有重名变量,于是就出现了重复定义的错误。
给每一个头文件加上条件编译,避免该文件被多次引用时被多次解释
- #ifndef TEST_H
- #define TEST_H
- ……
- #endif
方式二:
使用extern定义全局变量 ,所有的全局变量放入一个头文件 global.h (名字随意起,但要加条件编译)中,每一个变量前面加extern,声明一下这些变量将在其它文件中定义。
方式三: 增加 inline定义为内联函数
原因二: .CC 文件 包含了 .cc 文件
cannot find -lxxxxx 找不到动态库
问题原因:编译器编译出的动态库版本不匹配导致,如动态库是x86-64 版本,而 可执行程序是aarch64版本
通过 file命令查看 动态库是什么版本,如 x86-64 版本
file libxxxxx.so
问题同2.2 库的格式不匹配
排查函数是否只声明,没有定义
参考文献:
【1】C++编译报错:does not name a type_Am最温柔的博客-CSDN博客
【2】解决C++项目编译时的multiple definition of重定义问题_你喜欢梅西吗的博客-CSDN博客
【3】解决C++中multiple definition of问题_慢慢的燃烧的博客-CSDN博客
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。