inline

 久々にC++書いてます。

#include <iostream>
using namespace std;

class Foo
{
  private:
    int i;
  public:
    Foo();
    ~Foo();
    void set(int a);
    int get();
};
inline Foo::Foo() {
  i = 0;
  cout << "コンストラクタ" << endl;
}
inline Foo::~Foo() {
  cout << "デストラクタ" << endl;
}
inline void Foo::set(int a) {
  i = a;
  cout << "set " << i << endl;
}
inline int Foo::get() {
  return i;
}

int main() {
  Foo foo;
  foo.set(3);
  cout << foo.get() << endl;
  return 0;
}

実行結果

コンストラクタ
set 3
3
デストラクタ


 と言った具合に1つのファイルに書いていたのですが、クラスを定義している部分を別のファイルとして分割しようとした話です。

hoge.h

class Foo
{
  private:
    int i;
  public:
    Foo();
    ~Foo();
    void set(int a);
    int get();
};

hoge.cpp

#include <iostream>
#include "hoge.h"
using namespace std;

inline Foo::Foo() {
  i = 0;
  cout << "コンストラクタ" << endl;
}
inline Foo::~Foo() {
  cout << "デストラクタ" << endl;
}
inline void Foo::set(int a) {
  i = a;
  cout << "set " << i << endl;
}
inline int Foo::get() {
  return i;
}

main.cpp

#include <iostream>
#include "hoge.h"
using namespace std;
int main() {
  Foo foo;
  foo.set(3);
  cout << foo.get() << endl;
  return 0;
}


これをコンパイルしたところ、

Undefined symbols:
  "Foo::set(int)", referenced from:
      _main in cc0nIyYL.o
  "Foo::~Foo()", referenced from:
      _main in cc0nIyYL.o
      _main in cc0nIyYL.o
  "Foo::get()", referenced from:
      _main in cc0nIyYL.o
  "Foo::Foo()", referenced from:
      _main in cc0nIyYL.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

とエラーが。

 でもって原因を探した結果、hoge.cppのinlineが要らなかったようでした。inline使うとオーバーヘッドが少なくなって良いらしい? (上の場合だと意味ないかも)
http://www33.ocn.ne.jp/~loreley/FSB/cpp05.html
 とになく、inlineを消したらちゃんと動いてくれたのですが、イマイチinlineの挙動が分かってないです。どこでどう使えば良いんですかね?