《C primer》學習筆記之七 常見編譯錯

2021-04-06 18:03:43 字數 2204 閱讀 5764

8 常見編譯錯:

1. 如果乙個const物件訪問乙個非const成員函式會報錯:c2662: 「example2::print」 : 不能將「this」指標從「const example2」轉換為「example2&」

msdn的解釋:invoking a non-const member function on a const object.

4. 在函式定義之前呼叫函式引起的錯誤:

using namespace std;

cout << "begin at" << gettimestr() << endl;

char * gettimestr();

本想編譯的錯誤是:函式未定義,但實際出現三個錯誤:

1. error c2365: 「gettimestr」 : 重定義;以前的定義是「原先未知的識別符號」

msdn解釋為:'class member' : redefinition; previous definition was a 'class member'

比如:class c1

;這個編譯錯很是奇怪,懷疑是gettimestr這個名字特殊,改為gettimestr22後仍然如此。

2. error c2593: 「operator <<」不明確

操作符'<<'在namespace std中定義了很多,由於函式gettimestr的定義找不到,所以無法知道函式的返回值

這是overload函式引起的

3. error c3861: 「gettimestr22」: 即使使用引數相關的查詢,也未找到識別符號

這個才是真正的錯誤。

將gettimestr()的定義移到前面就好了。不過error1還是沒有搞清楚為何會出現。

6. template引起的編譯錯誤非常難懂:

(1)如果使用模板類而沒有include該類的標頭檔案會出現下面錯: 

vector< int > _stack;  //使用vector類

d:/len/begin3/istack.h(31): error c2143: 語法錯誤 : 缺少「;」(在「<」的前面)

原因:編譯器不知道vector識別符號為乙個模板的名字,所以引起後面的template parameter解析出錯

解決辦法:#include //將vector的標頭檔案include進來

(2) template function引起的符號找不到link錯:

場景://in common.h

templatevoid myprint(t); //just declare in header

//in common.cpp      //define in .cpp

#include "common.h"

templatevoid myprint(t t){ cout << t <(int)找不到定義

原因:template compilation model有兩種:inclusion model 和 separate model

vc 使用inclusion model,它要求template的定義在每個使用它的檔案中都被include,一般將template的定義放在header中。

(separate model則像普通函式一樣處理,將delare放在header中,然後在cpp中定義它,但千萬注意:定義時要使用export關鍵字。)

解決辦法:

1. 在common.cpp中定義myprint時加上export關鍵字,為:

export templatevoid myprint(t){ cout << t (_ranit,_ranit)」 : 不能將引數 2 從「std::vector<_ty>::const_iterator (void) const」轉換為「std::vector<_ty>::iterator」

場景: 

vectorline;

std::sort(line.begin(), line.end);  //注意:函式呼叫end錯誤,應為end()

原因:呼叫引數的型別和 模板引數的型別不匹配

錯誤的函式呼叫end,使得:第乙個呼叫引數型別為std::vector<_ty>::iterator

第二個呼叫引數型別為std::vector<_ty>::const_iterator (void) const (函式指標型別)

由錯誤的現象很難看到錯誤的原因。

C Primer讀書筆記(七)

stl 中 string list deque vector set map 容器的區別 在stl中基本容器有 string vector list deque set map set 和map都是無序的儲存元素,只能通過它提供的介面對裡面的元素進行訪問 set 集合,用來判斷某乙個元素是不是在乙個...

C primer前七章筆記

1.輸出 cout 標準輸出 cerr 標準錯誤,不緩衝,不重定向,直接傳送到顯示器 clog 關聯標準錯誤,緩衝的,存入日誌檔案 2.重新整理 endl重新整理流,讀cin會重新整理cout 3.檢查輸入int value while cin value 當遇到檔案結束符或無效輸入 讀入的值不是乙...

C Primer 學習筆記之關聯容器

關聯容器 關聯容器支援通過鍵來高效地查詢和讀取元素。兩個基本的關聯容器型別是map和set。map的元素以鍵 值對的形式組織 鍵用作元素在map的索引,而值則表示所儲存和讀取的資料。set僅包含乙個鍵,並有效地支援關於某個鍵是否存在的查詢。set和map型別的物件不允許為同乙個鍵新增第二個元素。如果...