比如:在 String.h 中定义了一个 String 类
然后再在 String.cpp 中实现几个成员函数,并将它们定义成 inline
在 vc.net 中编译link出错
错误信息:CppPrimer_StringClass error LNK2019: 无法解析的外部符号 "public: __thiscall String::~String(void)" (??1String@@QAE@XZ) ,该符号在函数 _main 中被引用我将 inline 去掉后(或者定义写到头文件中后)一切正常这是怎么回事,成员函数的 inline 声明必须在头文件中吗?
然后再在 String.cpp 中实现几个成员函数,并将它们定义成 inline
在 vc.net 中编译link出错
错误信息:CppPrimer_StringClass error LNK2019: 无法解析的外部符号 "public: __thiscall String::~String(void)" (??1String@@QAE@XZ) ,该符号在函数 _main 中被引用我将 inline 去掉后(或者定义写到头文件中后)一切正常这是怎么回事,成员函数的 inline 声明必须在头文件中吗?
如果在类的内部来写的话,在函数前要加上inline
inline void test() {}; 如果不在类内部完成,则类内部可这样
void test();
而在类外部,头文件或实现文件中
inline void myclass::test()
{
}
String.h
String.cpp
成员函数:
bool operator==(const String &rhs)
bool operator==(const char *str)
数据成员:
int _size -- 字符串长度
char *_stringString.cpp 中定义的成员函数一旦声明成 inline 就会找不到函数定义但是要是将定义包含在 String.h 中,又会“成员函数不能重复定义”我这里有什么问题???P.S.
将inline 声明去掉就一切正常,或者将定义部分包括在头文件中就一切正常是不是inline只能在头文件中定义?
String.h#pragma once
#include <cstring>
#include <assert.h>
#include <iomanip>
#include <iostream>using namespace std;class String
{
public:
String();
String(const char* str);
String(const String &rhs); ~String(); bool operator==(const String &rhs);
bool operator==(const char *str); int size()
{
return _size;
};
char* c_str()
{
return _string;
};
//----------------------------
private:
int _size;
char* _string;
};====================================================
String.cpp#include "String.h"using namespace std;inline bool String::operator==(const String &rhs)
{
if(_size!=rhs._size)
return false;
return strcmp(_string,rhs._string)?false:true;
};inline bool String::operator==(const char *str)
{
return strcmp(_string,str)?false:true;
};
#include <cstring>
#include <assert.h>
#include <iomanip>
#include <iostream>using namespace std;class String
{
public:
String();
String(const char* str);
String(const String &rhs); ~String(); inline bool operator==(const String &rhs);
inline bool operator==(const char *str); int size()
{
return _size;
};
char* c_str()
{
return _string;
};
//----------------------------
private:
int _size;
char* _string;
};====================================================
String.cpp#include "String.h"using namespace std;bool String::operator==(const String &rhs)
{
if(_size!=rhs._size)
return false;
return strcmp(_string,rhs._string)?false:true;
};bool String::operator==(const char *str)
{
return strcmp(_string,str)?false:true;
};
如果你把它们放在String.cpp ,那你可以在String.h加上
定义保护;
#ifndef XXXXX
#define XXXXX
.......
......
#endif
你的猜测是对的,inline确实只能在头文件中实现.否则就会error LNK2019
msdn中有详细解释.