C++編譯錯誤雜記

2018年12月23日

error: no matching function for call to ×××

  • 表明沒有找到匹配函數的相關參數,可能的緣由有:
    1. 參數類型不匹配;
    2. 參數構造錯誤,例如構造函數CLRead read_buff()就是一種錯誤的構造,致使read_buff沒法被識別, 出現note: no known conversion for argument 1 from ‘CLRead (*)()’ to ‘CLRead*’
    3. 函數名稱寫錯。

2018年12月10日

error: expected ‘)’ before ‘*’ token

  • 文件中的一些類沒有被聲明。致使的緣由多是:
    1. 自定義頭文件與系統中的文件重疊,致使自定義文件沒有被加載。可是 file.h是系統定義的頭文件。這致使本身定義的file.h被覆蓋。
    2. 加載了正確的自定義頭文件,可是沒有聲明要使用的自定義類。
// 錯誤
#define FILE_H
#include "file.h"
#endif

// 正確
#define FILE_H
#include "myfile.h"
#endif

class CLFileBuff;  // 聲明後才能使用,要否則也會出現這類錯誤

參考資料
error: expected ')' before '*' tokenc++

2018年11月15日

error: invalid conversion from ‘const char*’ to ‘char*’

  • 常量指針沒法直接賦值給普通指針,若是不得不賦值,要經過強制類型轉換
  • 可是若是賦值過程發生在函數變量處,不會報錯,多是由於自動進行了強制類型轉換
// 錯誤
char* prt;
prt = str;

// 正確
char* prt;
prt = (char*)str;

2018年11月11日

error: a storage class can only be specified for objects and functions

  • 聲明自定義類時,不能加static
// 錯誤
// file: C.h
class C{
};
// file: main
#include "C.h"
static class C;
... ...

// 正確
// file: C.h
class C{
};
// file: main
#include "C.h"
class C;
... ...

error: cannot call member function ××× without object

  • 調用類內的函數時,必須經過實例來調用,不能夠直接經過類名調用
// 錯誤
class C{
    int func(){}
};

int c = C::func();
... ...

// 正確
class C{
    int func(){}
};

C temp;
int c = temp.func();
... ...

error: uninitialized reference member in ××× [-fpermissive]

  • 沒有初始化引用
// 錯誤
class C{
    int a;
    int &r;
    C();
};
C::C(){
    a = 1;
}
... ...

// 正確
class C{
    int a;
    int &r;
    C();
};
C::C():r(a){
    a = 1;
}
... ...

error: passing ‘const ×××’ as ‘this’ argument discards qualifiers [-fpermissive]

  • 調用const變量時,相關函數沒有明確是const的,可能存在被修改風險
// 錯誤
#include<iostream>
class C{
private:
    int a;
public:
    bool func(){
        cout << "hello: " << this->a << endl;
        }
    C(const C& c){
        c.func();
    }
};
C c1;
C c2(c1);

// 正確
#include<iostream>
class C{
private:
    int a;
public:
    bool func() const{
        cout << "hello: " << this->a << endl;
        }
    C(const C& c){
        c.func();
    }
};
C c1;
C c2(c1);

參考資料
error: passing 'const …' as 'this' argument of '…' discards qualifiers
error:passing 'const Student' as 'this' argument of 'void Student::print()' discards qualifiersexpress

error: default argument given for parameter 2 of ×××

  • c++能夠在類的聲明中,也能夠在函數定義中聲明缺省參數,但不能既在類聲明中又在函數定義中同時聲明缺省參數。
// 錯誤
class C{
   C(int a=1);
}
C::C(int a=1){;}

// 正確
class C{
   C(int a=1);
}
C::C(int a){;}
};

2018年11月10日

error: new types may not be defined in a return type

  • 定義類時在最後「}」後面沒有「;」
// 錯誤
class C{
    ... ...
}

// 正確
class C{
    ... ...
};

error: two or more data types in declaration of ...

  • 頭文件相互包含,使用以下方法解決
#ifdef ××××    //定義一個宏,一般是該頭文件名大寫
#define ××××
#endif

error: ... does not name a type

  • 定義該類時,沒有用class關鍵字,例如:
// 定義C類
// 錯誤
C{
    ... ...
};

// 正確
class C{
    ... ...
};

error: stray ‘\357’ in program

  • 通常是出現了中文符號

error: ××× does not name a type

  • 在包含相應有文件的狀況下,仍然會出現沒有定義的狀況,這是由於沒有在該文件下聲明該類型,以下:
// 錯誤
// file: C.h
class C{
    ... ...
};
// file: test.h
#include "C.h"
C test;
... ...

// 正確
// file: C.h
class C{
    ... ...
};
// file: test.h
#include "C.h"
class test;

C test;
... ...

error: ‘virtual’ outside class declaration

  • 在類的外部定義虛函數時,不用再聲明爲"virtual"
// 錯誤
class C{
    virtual C();
};

virtual C(){
    ... ...
}

// 正確
class C{
    virtual C();
};

C(){
    ... ...
}

error: expected primary-expression before ‘const’

  • 由於在調用函數時,仍然帶有變量類型,以下:
// 錯誤
const char* pathname = "hello.txt";
oflag = O_RDWR|O_APPEND;
this->_fd = open(const char* pathname, int oflag);

// 正確
const char* pathname = "hello.txt";
oflag = O_RDWR|O_APPEND;
int fd = open(pathname, oflag);
相關文章
相關標籤/搜索