テンプレートクラスをライブラリに組み込むためにインスタンス化しようとしているのですが、
演算子オーバーロードフレンド関数のインスタンス化の方法がわかりません。
具体的には下のようなテンプレートクラスをインスタンス化します。
hoge.h
コード:
template <typename T>
class choge
{
T m_val;
public:
// コンストラクタ
choge() : m_val(0) {}
// 変換コンストラクタ
choge(T val) : m_val(val) {}
// +演算子オーバーロード
choge operator+(const choge& hoge) const { return m_val + hoge.m_val; }
// +演算子オーバーロード(フレンド関数)
friend choge operator+(T val, const choge& hoge) { return hoge.m_val + val; }
};
インスタンス化したコードは、現状では以下のようになっています。
hoge.h
コード:
template <typename T>
class choge
{
T m_val;
public:
// コンストラクタ
choge();
// 変換コンストラクタ
choge(T val);
// +演算子オーバーロード
choge operator+(const choge& hoge) const;
// +演算子オーバーロード(フレンド関数)
friend choge operator+(T val, const choge& hoge);
};
hoge.cpp
コード:
// コンストラクタ
template <typename T>
choge<T>::choge()
: m_val(0)
{
}
// 変換コンストラクタ
template <typename T>
choge<T>::choge(T val)
:m_val(val)
{
}
// +演算子オーバーロード
template <typename T>
choge<T> choge<T>::operator+(const choge<T>& hoge) const
{
return m_val + hoge.m_val;
}
// テンプレートクラスのインスタンス化
template class choge<int>;
template class choge<double>;
// +演算子オーバーロード(フレンド関数)
choge<int> operator+(int val, const choge<int>& hoge)
{
return hoge.m_val + val;
}
choge<double> operator+(double val, const choge<double>& hoge)
{
return hoge.m_val + val;
}
フレンド関数はテンプレートを使わずにタイプ別に作っていてあまりかっこよくありません。
演算子オーバーロードフレンド関数をテンプレートから生成するにはどうしたらよいか教えてください。
Compiler
Visual Studio 2015
Visual C++