5

次のコードでコンパイル時に問題が発生しています。

  template <typename T, 
            template <class T, class Allocator = std::allocator<T> > class C>
  bool is_in(const C<T>& a, const C<T>& b);

  template <typename T, std::vector> // HERE
  bool is_in(const std::vector<T>& a, const std::vector<T>& b)
  {
    return false; // implementation tbd
  }

...

vector<int> a, b;

cout << is_in(a,b) << endl;

エラーメッセージは次のとおりです(「ここ」とマークされた行):

error: 'std::vector' is not a type

(もちろん、私stdからのベクトルを含めました!)。なにか提案を?私はしばらくそれをいじりましたが、私はいくつかの助けを使うことができるようになりました:-)私は最初のテンプレート宣言を部分的に特殊化して、実際のタイプに応じてコンパイラスイッチの実装を持たせる必要がありますコンテナC(セット用にis_in、ベクトル用に1つ、範囲用に1つ、毎回異なるアルゴリズムがあります)。

ありがとう!

4

3 に答える 3

6

関数テンプレートの部分的な特殊化は、標準では許可されていません。

簡単な解決策は次のとおりです。オーバーロードを使用します。

template <typename T> 
bool is_in(const std::vector<T>& a, const std::vector<T>& b)
{
  return false; // implementation tbd
}

これはオーバーロードされた関数テンプレートです。その部分的な特殊化ではありません。

または、これを行うことができます:

namespace detail
{
    template<typename T, typename C>
    struct S
    {
        static bool impl(const C & a, const C & b)
        {
            //primary template
            //...
        }
    }
    template<typename T>
    struct S<T, std::vector<T> >
    {
        static bool impl(const std::vector<T> & a, const std::vector<T> & b)
        {
            //partial specialization for std::vector
            return false;
        }
    }
}

template <typename T,  template <class T, class Allocator = std::allocator<T> > class C>
bool is_in(const C<T>& a, const C<T>& b)
{
   return detail::S<T, C<T> >::impl(a,b);
}
于 2011-06-09T19:58:23.740 に答える
1

関数テンプレートの部分的な特殊化は許可されていません。テンプレートの特殊化構文を使用していない場合は、実際には追加のオーバーロードを記述しています。代わりにこれを試してください:

template <typename T>
bool is_in(const std::vector<T>& a, const std::vector<T>& b)
{
    return false; // implementation tbd
}

部分的な特殊化許可されている場合、代わりに次のようになります。

template <typename T> // std::vector is not a template parameter,
                      // so we wouldn't put it here
bool is_in<T, std::vector>(const std::vector<T>& a, const std::vector<T>& b)
// instead, it'd appear ^ here, when we're specializing the base template
{
    return false; // implementation tbd
}
于 2011-06-09T20:06:28.277 に答える
0

それが機能するかどうかはわかりませんが(テンプレートテンプレートは常に頭に浮かぶので)、試してみるだけではどうでしょうか

template <typename T>
bool is_in(const std::vector<T>& a, const std::vector<T>& b)
{
    ...
}

それは専門です。

編集:他の人はこれについてすでに明らかにしていますが、完全を期すために追加します。上記のコードは実際にはオーバーロードであり、部分的な特殊化ではありませんが、部分的な関数の特殊化はとにかく許可されていません。

于 2011-06-09T20:01:21.717 に答える