VS报错

作者: downdemo | 来源:发表于2018-03-25 20:27 被阅读18次

    此运算符的参数太多

    • 在重载运算符时容易出现此问题
    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;
    
    // 类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文件中的只是声明

    相关文章

      网友评论

          本文标题:VS报错

          本文链接:https://www.haomeiwen.com/subject/jeekcftx.html