私は、テンプレートの特殊化を使用して異なる方法でハンドルのテンプレート関数を実装しようとしています。静的メンバー関数のテンプレートの特殊化。の仕方?
次のコードは、GCCで私に「非名前空間スコープでの明示的な特化」を与える:
template <typename T>
static T safeGuiCall(boost::function<T()> _f)
{
if (_f.empty())
throw GuiException("Function pointer empty");
{
ThreadGuard g;
T ret = _f();
return ret;
}
}
// template specialization for functions wit no return value
template <>
static void safeGuiCall<void>(boost::function<void()> _f)
{
if (_f.empty())
throw GuiException("Function pointer empty");
{
ThreadGuard g;
_f();
}
}
私はクラスの外に移動してみました(クラスはテンプレートではありません)と名前空間にしましたが、 「明示的な特殊化にはストレージクラスを持たない」というエラーが表示されます。私はこれについて多くの議論を読んだことがありますが、人々は機能テンプレートをどのように特化するかについて合意していないようです。何か案は?
hm私は今同じことを試みましたが、それを.hppファイルに入れて、それを含めようとしました... "vodi Xの複数定義:ff(Test )というエラーが表示されます。違いがありますか? –
Rolle
コンパイラまたはリンカのエラーですか?コンパイラエラーの場合は、おそらくテンプレートヘッダーを複数回インクルードしていて、ヘッダーガードがなくなっていることを意味します。つまり、コンパイラは実装の定義を2つ(正確には正確です)表示します。 –
最初のケースでインラインを追加するのはなぜですか?そうでない場合は、私はコンパイルのエラーを取得しています。 – sop