VS报错
2018-03-25 本文已影响18人
downdemo
此运算符的参数太多
- 在重载运算符时容易出现此问题
class A {
...
ostream& operator<<(ostream& os, A& a) { ... }
};
- 问题在于,类中重载双目运算符,默认左边是*this,因此只接受一个参数,所以这里应该把其写在类外,即写成友元函数
class A {
...
friend ostream& operator<<(ostream& os, A& a) { ... }
};
ostream& operator<<(ostream& os, A& a) { ... }
error LNK2019: unresolved external symbol "public: __thiscall
- 报错为
error LNK2019: unresolved external symbol "public: __thiscall MyClass::~MyClass(void)"
- 原因:类中有声明但未定义,这里指出了错误出在MyClass类中的~MyClass(void),即析构函数没有定义。在写析构的时候,如果写成
~A();
- 只是声明,而后很容易忘记此处未定义,所以写的时候就应该注意
~A() {}
error C2678: binary '<<' : no operator found which takes a left-hand operand of type 'std::ofstream'
- 错误产生于重载操作符,ofstream& operator<<(std::ofstream&, A&)的定义中
std::ofstream& operator<<(std::ofstream &of, A &a)
{
of << a.ID << a.pwd;
return of;
}
- 原因是类的成员是一个string类型,必须同时包含<fstream>和<string>,通常是因为习惯性包含<iostream>但没有包含<fstream>
#include <fstream>
#include <string>
std::ofstream& operator<<(std::ofstream &of, A &a)
{
of << a.ID << a.pwd;
return of;
}
- 下面的例子同理
// 没有包含<string>
#include <iostream>
int main()
{
std::string s("hello");
std::cout << s;
}
// 没有包含<fstream>
#include <string>
int main()
{
std::string s("hello");
std::ofstream fout;
fout.open("test.txt", std::ios_base::in);
fout << s;
}
error LNK2001: unresolved external symbol
- 同时还会出现fatal error LNK1120: 1 unresolved externals
- 错误原因为使用了未定义的外部变量,出现场景如下,使用了未定义的容器类型的全局变量
// var.h
// 声明一个全局变量
#ifndef VAR_H
#define VAR_H
#include <vector>
extern std::vector<int> v;
#endif
// func.h
// 声明函数
#ifndef FUNC_H
#define FUNC_H
void f();
#endif
// main.cpp
// 什么都不做
int main() {}
// func.cpp
// 给全局变量添加一个元素
#include "func.h"
#include "var.h"
void f()
{
v.push_back(1);
}
- 根据通常的理解,声明一个vector<int>直接就可以用了,但如果分解为多个文件则不一样,在头文件中声明后,还需要在一个dot-c文件中定义,即使定义和声明看起来是一样的。在dot-c文件中,不需要再包含头文件已经包含过的部分,即不用再写#include <vector>
// var.cpp
// 加上此文件即可
#include "var.h"
std::vector<int> v;
- 如果将容器中的元素为一个类也是同理,下面是一个map<string, A>的例子(A是一个类)。此时如果发生错误通常是由于类写错了,如VS报错:error LNK2019: unresolved external symbol "public: __thiscall
// 类A的声明在A.h中
// 类A的定义在A.cpp中
// var.h
#ifndef VAR_H
#define VAR_H
#include <string>
#include <map>
#include "A.h"
extern std::map<std::string, A> a;
#endif
// var.cpp
#include "var.h"
std::map<std::string, A> a;
// func.h
#ifndef FUNC_H
#define FUNC_H
void f();
#endif
// func.cpp
#include "func.h"
#include "var.h"
void f()
{
A temp;
a.insert(std::make_pair("hello", temp));
}
- 因为如果包含了头文件,就等于包含了头文件中#include的部分,所以会想到把dot-c文件中的所有#include都移到头文件中去。但是这样做并不好
- 编译时每个编译单元都生成一个.obj文件,编译需要耗费更多的时间。也有预编译头文件的机制,但通常用于基本不做修改的部分
- 增加了文件之间的依赖性,单元测试不容易做
- 对外部提供,可以放到一个头文件中,如<windows.h>
MFC报错
error C2065: 'IDD_DIALOG1' : undeclared identifier
- 新建了一个Dialog,为其添加类,需要在生成的类中#include "resource.h"
- 有时莫名出现这个报错,分别试试在xxxDlg.cpp和xxx.cpp文件中包含头文件
error C2065: 'm_pSet' : undeclared identifier
- m_pSet是CRecordset中的指针,所以没定义是因为没包含这个类,这个错误会发生在添加消息响应函数时,Class List选择了错误的类,比如要选择xxxView但误选了名字相似的CClassView
error C2143: syntax error : missing ',' before '&'
- 错误:下列代码是类B的一个公有成员函数,用鼠标指到A能显示类A的类型,按F12可以跳转到定义,但报错error C2143: syntax error : missing ',' before '&'
// file B.h
void f(const A &p);
- 原因在于A其实未被识别出来,头文件包含顺序中,A.h需要在B.h之前被包含
error C4430: missing type specifier
- 报错:error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
- 解决方案:
PROJECT - Properties - Configuration Properties - C/C++ - Command Line - Addtional Options
添加/wd4430
This function or variable may be unsafe
- 报错:This function or variable may be unsafe Consider using xxx instead
- 解决方案:
PROJECT - Properties - Configuration Properties - C/C++ - Processor - Processor Definitions
添加_CRT_SECURE_NO_WARNINGS
function XXX already has a body
- 给.h文件中的构造函数添加定义(初始化成员变量)时出现此问题,构造函数的定义在.cpp文件,.h文件中的只是声明