2014-04-12 77 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文件添加到其他项目中。然后它将被编译,并将结果对象传递给链接器。 –