比如:在 String.h 中定义了一个 String 类
然后再在 String.cpp 中实现几个成员函数,并将它们定义成 inline
在 vc.net 中编译link出错
错误信息:CppPrimer_StringClass error LNK2019: 无法解析的外部符号 "public: __thiscall String::~String(void)" (??1String@@QAE@XZ) ,该符号在函数 _main 中被引用我将 inline 去掉后(或者定义写到头文件中后)一切正常这是怎么回事,成员函数的 inline 声明必须在头文件中吗?

解决方案 »

  1.   

    不一定要放在头文件,
       如果在类的内部来写的话,在函数前要加上inline
    inline void test()  {};   如果不在类内部完成,则类内部可这样
       void test();
       而在类外部,头文件或实现文件中
       inline void  myclass::test()
       {
       }
      

  2.   

    我的问题可能没有说清楚,这里附上全部的内容String -- 字符串类
    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;
    };
      

  3.   

    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(); 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;
    };
      

  4.   

    maybe your codes causes a namespace confliction
      

  5.   

    inline函数在类内不用加inline,直接给出函数体就可以啦。
    如果你把它们放在String.cpp ,那你可以在String.h加上
    定义保护;
    #ifndef XXXXX
    #define XXXXX
    .......
    ......
    #endif
      

  6.   

    又是error LNK2019.我遇到过不知多少回了.
    你的猜测是对的,inline确实只能在头文件中实现.否则就会error LNK2019
    msdn中有详细解释.