1. 程式人生 > >連結器工具錯誤 LNK2019 C++primer5第十五章程式錯誤的解決

連結器工具錯誤 LNK2019 C++primer5第十五章程式錯誤的解決

編寫C++第十五章15.9 文字程式再探程式時 由於初寫C++程式造成許多錯誤

最初是出現LNK2005錯誤 由於重複定義標頭檔案產生,通過查詢在每個標頭檔案前鍵入條件預處理指令如下

#ifndef NOTQUERY //如果沒有定義這個巨集
#define NOTQUERY //定義這個巨集

#include "Query_base.h"
#include"Query.h"
class NotQuery :
    public Query_base
{
    friend Query operator~(const Query &);
    NotQuery(const Query &q):query(q){}
    std::string rep() const { return "~(" + query.rep() + ")"; }
    QueryResult eval(const TextQuery&)const;
    Query query;

};
inline Query operator~(const Query  &operand)
{
    return std::shared_ptr<Query_base>(new NotQuery(operand));
}
#endif

解決標頭檔案重複定義問題。

但該方法不是總有效,由於在標頭檔案中定義了全域性函式導致該方法失效,經改正在標頭檔案中宣告函式原型,在.cpp中定義全域性函式解決問題。

同時定義主函式main時出現如下問題

錯誤    LNK2019    無法解析的外部符號 "public: __thiscall Query::Query(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" ([email protected]

@[email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@Z),該符號在函式 _main 中被引用    ConsoleApplication11    C:\Users\Edwin\Documents\Visual Studio 2015\Projects\ConsoleApplication11\ConsoleApplication11\ConsoleApplication11.obj    

經過查詢是由於在.cpp檔案下定義行內函數導致的問題後將該行內函數定義在標頭檔案中 錯誤消失。

程式碼:Query.cpp檔案

#include "stdafx.h"
#include "Query.h"
#include"WordQuery.h"

inline
Query::Query(const std::string &s):q(new WordQuery(s))
{

}
改程式碼在.cpp檔案下定義內聯函數出現LNK2019錯誤

現改為在Query.h檔案下定義

#include<string>
#include"QueryResult.h"
#include"TextQuery.h"
#include"Query_base.h"
#include"WordQuery.h"
class Query
{
    friend Query operator~(const Query &);
    friend Query operator|(const Query &, const Query &);
    friend Query operator&(const Query &, const Query &);
public:
    Query(const std::string&);
    QueryResult eval(const TextQuery &t)const { return q->eval(t); }
    std::string rep() const { return q->rep(); }
    //~Query();
private:
    Query(std::shared_ptr <Query_base>query):q(query) {}
    std::shared_ptr<Query_base> q;

};
inline
Query::Query(const std::string &s) :q(new WordQuery(s))
{

}

錯誤消失。


相關推薦

連結工具錯誤 LNK2019 C++primer5程式錯誤解決

編寫C++第十五章15.9 文字程式再探程式時 由於初寫C++程式造成許多錯誤 最初是出現LNK2005錯誤 由於重複定義標頭檔案產生,通過查詢在每個標頭檔案前鍵入條件預處理指令如下 #ifndef NOTQUERY //如果沒有定義這個巨集 #define NOTQUER

C++高階程式設計 : 處理錯誤

這一章主要講了異常處理的機制, 還有異常的種類, 怎樣設計比較好, 怎樣設計使用異常處理等等. 1.到底什麼是異常 異常是一種機制: 一段程式碼發生了錯誤情況後, 就會通知另外一段程式碼. 然後程式就不會再沿著正常的程式碼路徑前進了, 遇到錯誤的程式碼會

c++ primer 習題

c++ primer 第十五章習題 練習15.1 派生類需要覆蓋的基類中的virtual成員 練習15.2 protected訪問符定義的成員可以被繼承類的成員函式及友元訪問,private只能被當前類的成員和友元訪問。 練習15.3 class Qu

程式除錯與異常處理

15.1NSLog使用方法 15.2程式除錯方法 15.2.1使用LLDB命令除錯程式 15.2.2在系統丟擲異常處設定斷點 15.3異常處理 15.3.1異常的概念 15.3.2異常處理的概念 15.3.3Objective-C中如何進行異常處理

c++ primer 特殊工具與技術

c++ primer 第十九章特殊工具與技術 19.1 控制記憶體分配 19.1.1 過載new和delete 19.1.2 定位new表示式 19.2 執行時型別識別 19.2.1 dyna

c++ primer 用於大型程式工具

c++ primer 第十八章用於大型程式的工具 18.1 異常處理 18.1.1 丟擲異常 18.1.2 捕獲異常 18.1.3 函式try語句塊與建構函式 18.1.4 noexcept異常說明

C++ primer 筆記之 動態內存

weak memory ont 創建 tor size prim 自動 pre 動態內存: 運算符:new,delete 智能指針: 頭文件:memory shared_ptr:允許多個指針指向同一個對象; unique_ptr:"獨占"所指向的對象; weak_ptr:

C++筆記 課 類與封裝的概念---狄泰學院

如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。 學習C++編譯環境:Linux 第十五課 類與封裝的概念 1.類的組合 電腦一般而言是由CPU,記憶體,主機板,鍵盤和硬碟等部件組合而成。 思考 1.學習電腦組裝需要多少時間?幾個月 2.學習電腦組裝是否

c++ primer 習題

c++ primer 第十四章習題 練習14.1 具體實現有區別 優先順序結合律和大致功能一樣 練習14.2 ostream& operator<<(std::ostream& os, const Sales_data&

c++ primer 過載運算與型別轉換

c++ primer 第十四章過載運算與型別轉換 14.1 基本概念 14.2 輸入和輸出運算子 14.2.1 過載輸出運算子<< 14.2.2 過載輸入運算子>> 14.3 算術

c++ primer 習題

練習12.1 都是4個 練習12.2 #ifndef MYSTRBLOB_H #define MYSTRBLOB_H #include <initializer_list> #include <memory> #include <stdexcept> #

c++ primer 習題

c++ primer 第十九章習題 練習19.1 2 #include <iostream> #include <cstdlib> void *operator new(std::size_t n){ std::c

c++ primer 習題

c++ primer 第十八章習題 練習18.1 (a) range_error (b range_error 會丟擲臨時物件指標 練習18.2 會銷燬函式中創造的物件,其中指標p會導致記憶體洩漏 練習18.3 可以把指標p使用智慧指標或者封裝成有解構函式的類

c++ primer 習題

c++ primer 第十七章習題 練習17.1 tuple<int,int,int> t1{10,20,30}; 練習17.2 tuple<string,vector<string>,pair<string,int>

c++ primer 標準庫特殊設施

c++ primer 第十七章標準庫特殊設施 17.1 tuple型別 17.1.1 定義和初始化tuple 17.2 bitset 型別 17.2.1 定義和初始化bitset 17

c++ primer 習題

c++ primer 第十六章習題 練習16.1 例項化是指傳遞給模板相應的模板引數,使其生成對應型別的函式體或是型別定義。 練習16.2 #include <iostream> #include <string> #include

C++Primer Plus筆記—— 友元、異常和其他總結及程式清單

目錄 本章小結 程式清單 友元類 巢狀類  異常 本章小結        友元使得能夠為類開發更靈活的介面。類可以將其他函式、其他類和其他類的成員函式作為友元。在某些情況下,可能需要使用前向宣告,需要特別注意類和方法宣告的順序

C++Primer Plus筆記—— 友元、異常和其他課後程式設計練習答案

課後程式設計練習答案 習題1                習題2               習題3             習題4 習題1 //tv.h #ifndef TV_H_ #define TV_H_ #include <iostream> u

C#圖解教程 介面

介面 什麼是介面 介面是指定一組函式成員而不實現它們的引用型別。所以只能類和結構來實現介面。 這種描述比較抽象,直接來看個示例。 下例中,Main方法建立並初始化了一個CA類的物件,並將該物件傳遞給PrintInfo方法。 class CA { public str

c++ primer答案

15.01 什麼是虛成員? 虛成員是基類希望派生類進行覆蓋的函式,在其成員前加關鍵字virtual,使得該成員可以實現動態繫結。 15.02 protected訪問說明符與private有何區別? private成員:即使是基類的派生類也無法直接訪問。 protected成員:基類的