2014-04-12 74 views
0

我有,指出每個函數的聲明頭文件:實際的功能在這裏C++ LNK2019當包括頭

#ifndef TYPECONVERTER_H_INCLUDED 
#define TYPECONVERTER_H_INCLUDED 

#include <iostream> 
#include <string> 
#include <vector> 
#include <Windows.h> 

using namespace std; 

unsigned int letter2number(char input); 
char number2letter(unsigned int input); 

string chararr2string(char *input); 
string char2string(char input); 

char string2char(string input); 
char *string2chararr(string input); 

string int2string(int input); 
int string2int(string input); 
wstring string2wstring(const std::string& input); 

LPSTR string2lpstr(string input); 

vector<int> intarr2intvector(int input[]); 

int *vectorint2intarr(vector<int> input); 

vector<string> strarr2vectorstr(string *input); 
string *vectorstr2strarr(vector<string> input); 

vector<char> chararr2vectorchar(char *input); 
char *chararr2vector(vector<char> input); 

string wchar2string(WCHAR wc[260]); 


#endif 

然後.cpp文件:

#include "stdafx.h" 

#include <iostream> 
#include <string> 
#include <vector> 
#include <Windows.h> 
#include "TypeConverter.h" 

using namespace std; 

unsigned int letter2number(char input) 
{ 
    if(input >= 'A' && input <= 'Z') 
     return input - 64; 
    else if(input >= 'a' && input <= 'z') 
     return input - 96; 
    return 0; 
} 

char number2letter(unsigned int input) 
{ 
    if(input >= 1 && input <= 26) 
     return input + 96; 
    return 'a'; 
} 

string chararr2string(char *input) 
{ 
    string ret(input); 
    return ret; 
} 

string char2string(char input) 
{ 
    string ret = ""; 
    ret += input; 
    return ret; 
} 
char string2char(string input) 
{ 
    return input[0]; 
} 

char *string2chararr(string input) 
{ 
    char *ret=new char[input.size()+1]; 
    ret[input.size()]=0; 

    memcpy(ret,input.c_str(),input.size()); 

    return ret; 
} 
string int2string(int input) 
{ 
    return std::to_string(input); 
} 

int string2int(string input) 
{ 
    try{ 
     stoi(input); 
     return stoi(input); 
    } 
    catch(std::invalid_argument){ 
     return 1; 
    } 

} 

wstring string2wstring(const std::string& input) 
{ 
    std::wstring ret = std::wstring(input.begin(), input.end()); 
    return ret; 
} 

LPSTR string2lpstr(string input) 
{ 
    return const_cast<char *>(input.c_str()); 
} 

vector<int> intarr2intvector(int input[]) 
{ 
    std::vector<int> ret(input, input + sizeof input/sizeof input[0]); 
    return ret; 
} 

int *vectorint2intarr(vector<int> input) 
{ 
    int *ret = &input[0]; 
    return ret; 
} 

vector<string> strarr2vectorstr(string *input) 
{ 
    std::vector<string> ret(input, input + sizeof input/sizeof input[0]); 
    return ret; 
} 

string *vectorstr2strarr(vector<string> input) 
{ 
    string *ret = &input[0]; 
    return ret; 
} 

vector<char> chararr2vectorchar(char *input) 
{ 
    std::vector<char> ret(input, input + sizeof input/sizeof input[0]); 
    return ret; 
} 

char *chararr2vector(vector<char> input) 
{ 
    char *ret = &input[0]; 
    return ret; 
} 

string wchar2string(WCHAR wc[260]) 
{ 

    char ch[260]; 
    char DefChar = ' '; 
    WideCharToMultiByte(CP_ACP,0,wc,-1, ch,260,&DefChar, NULL); 

    std::string ss(ch); 
    return ss; 
} 

當我使用:

#include "stdafx.h" 
#include <iostream> 
#include <string> 
#include "TypeConverter.h" 

using namespace std; 

int main() 
{ 
    cout << int2string(2) << endl; 
} 

,如果它在這兩個文件是在創建的項目它工作得很好但是,當我嘗試這樣做。在包含「TypeConverter.h」的另一個程序中也是這樣,它給了我一個LNK2019「無法解析的外部符號」錯誤。我究竟做錯了什麼?

+0

複製[什麼是未定義的引用/未解析的外部符號錯誤,以及如何解決它?](http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external -symbol-error-and-how-do-i-fix) –

回答

1

頭文件只是聲明的功能。您還需要定義他們。鏈接器錯誤告訴你它找不到函數的定義。

要麼編譯定義函數的源文件,要麼提供給鏈接器一個定義它們的對象文件或庫。

以下哪些選項適合您取決於您​​希望如何構建程序。不過,我的猜測是,包含源文件是最好的方法。這具有顯而易見的好處,即您的程序將始終與源代碼保持同步。

+0

我沒有在.cpp源文件中定義它們嗎?我搜索和搜索,這就是他們告訴我要做的...... – user3385706

+0

你確實在cpp源文件中定義了它們。但鏈接器沒有看到這些定義。我想你需要將cpp文件添加到其他項目中。然後它將被編譯,並將結果對象傳遞給鏈接器。 –