型に対していくつかの操作を持つテンプレートクラスを定義しようとしています。 ToStringメソッドは、Toolsテンプレートクラスがインスタンス化されたどのような型の名前空間でもToStringを呼び出すように実装する必要があります。メソッドと同じ名前の関数を呼び出す
namespace X
{
class SomeType
{
};
std::wstring ToString(SomeType)
{
// ...
}
}
template<class T>
class Tools
{
static auto ToString(T& t)
{
return ToString(t);
}
}
ToStringのツール実装でエラーが発生しました。コンパイラは、名前空間XのToStringを呼び出す代わりに、再帰的にToStringメソッドを再呼び出ししようとします。
X :: ToStringを使用することはできません。たとえば、私が使用する場合:
namespace Y
{
class SomeOtherType
{
};
std::wstring ToString(SomeOtherType)
{
// ...
}
}
Y::SomeOtherType someOtherType;
auto s = Tools<Y::SomeOtherType>::ToString(someOtherType); // Would fail as SomeOtherType isn't in namespace X.
これを行うことは可能ですか?
私はVS 2015 Update 3を使用しています。それに適したソリューションが好まれます。
関連:calling a global function with a class method with the same declaration
なぜ 'X :: ToString()'がうまくいかないのか分かりません。どういう意味ですか? – Galik
@Galik:彼は 'namespaceof(T):: ToString()'を望んでいるという意味です。つまり、 'Y :: ToString()'や 'Z :: ToString()'などであってもかまいません。だから、 'X :: ToString()'と書くのは正しいことではありません。 –
私が正しいと分かっていれば、 'X :: ToString();'を別のパラメータ型( 'X :: SomeType'と' Y :: SomeType')で呼び出せるように思えます。そのためには、テンプレート関数にする必要があります。 – Galik