...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

メンバ関数テンプレート

VS.NETのC++コンパイラは標準準拠レベルがかなり向上していると聞いている.
でも,テンプレートにはまだ問題があるみたい.
さあ,C++の深遠(といってもその入り口付近),メンバ関数テンプレートです.

どうしてもリンクエラーが出ると思っていたら,メンバ関数テンプレートの実装はヘッダーに書かないといけないようだ.
inline 指定したらいけるかと思ったけど駄目.
C++標準だったら可能だと思うんだけどなあ.←間違いでした.無理です.
確か,完璧なC++コンパイラって,まだ存在しないんだよ.
知ってた?

具体的なコードはまた今度書くつもり.

      • -

で,書きました.
説明が欲しい根性のある奴は名乗り出ろ(ぇ

ちなみに .hpp ってのは,ヘッダーだけにすべてを書いているからそうしただけ.
別に .h でも(実際のところ何でも)いいですよ.

ではダメな例.


// SayHello.hpp
struct SayHello
{
void operator()()
{
printf("Hello!\n");
}
};

// BadClass.h
struct BadClass
{
// ヘッダと実装を分けて書くとリンクエラー
template<typename T>
void templateMethod(T& doSomething);

/*
// これでもだめ
template<typename T>
inline void templateMethod(T& doSomething);
*/
};

// BadClass.cpp
#include "BadClass.h"
template<typename T>
void BadClass::templateMethod(T& doSomething)
{
doSomething();
}

// main.cpp
#include "SayHello.hpp"
#include "BadClass.h"
int main()
{
BadClass instance;
instance.templateMethod( SayHello() );
return 0;
}

そして正しい書き方.


// SayHello.hpp
struct SayHello
{
void operator()()
{
printf("Hello!\n");
}
};

// GoodClass.hpp
struct GoodClass
{
// 実装もヘッダに書いちゃいましょう
template<typename T>
void templateMethod(T& doSomething)
{
doSomething();
}
};

// main.cpp
#include "SayHello.hpp"
#include "GoodClass.hpp"
int main()
{
GoodClass instance;
instance.templateMethod( SayHello() );
return 0;
}