QA@IT

任意の型のテンプレートクラスを引数にとるメソッドを作ることはできないのでしょうか?

5851 PV

どのようなものを想定してるのか具体的にソースコードを記載します。

main.cpp

#include "Hoge.h"

int main()
{
    std::vector<int> v;
    v.push_back(10);
    v.push_back(20);

    auto hoge = Hoge();
    hoge.MethodExample(v);

    return 0;
}

Hoge.h

#ifndef __HOGE_H
#define __HOGE_H

#include <vector>

class Hoge
{
public:
    template <class T>
    void MethodExample(const std::vector<T>& v);
};

#endif

Hoge.cpp

#include "Hoge.h"

template<class T>
void Hoge::MethodExample(const std::vector<T>& v)
{
    // do something
}

現状、上記のように実装するとリンカのエラーが発生してしまいます。
型を限定したくないので特殊化は避けたいところです。

またヘッダーでメソッドの実装をするという案も避けたいです。

なにかいい方法をご存じでしたらご教示お願い致します。

回答

次のように宣言と定義をわけたっぽい感じにしてみるとか。

hoge.h

#ifndef __HOGE_H
#define __HOGE_H

#include <vector>

class Hoge
{
public:
    template<class T>
    void MethodExample(const std::vector<T>& v);

};

#include "hoge.inl"

#endif

hoge.inl

template<class T>
inline void Hoge::MethodExample(const std::vector<T>& v)
{
    // do something
}

C++11 で export が無くなったらしいので、特殊化かヘッダに実装を書くか以外に解決方法は無いと思います。

編集 履歴 (0)
  • 回答ありがとうございます!C++11使っているのでexportは使えないんですね。なるほど…間接的にヘッダに埋め込むのですか。こういう所がかゆいですねー -
ウォッチ

この質問への回答やコメントをメールでお知らせします。