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
場景:
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型別的物件不允許為同乙個鍵新增第二個元素。如果...