2

「セット」データ型があります。

template <class V>
struct Set {
  void add(const V& value) {}
};

のトップレベル関数バージョンを書きたいですSet::add

template <class V>
void add(const Set<V>& set, const V& value) {}

これは、文字列リテラルではうまく機能しません。

Set<const char*> set;
const char* val = "a";

set.add(val); // ok
set.add("a"); // ok

add(set, val); // ok
add(set, "a"); // ERROR
add<const char*>(set, "a"); // ok

エラー メッセージ (g++ 4.2.4):

no matching function for call to ‘add(Set<const char*>&, const char [2])’

"a"が type を持っていて を持ってconst char[2]いないという事実と関係があるようですconst char*。これを機能させる方法を知っている人はいますか?

4

2 に答える 2

4

問題はV、左のパラメーターに対して 1 つの型を取得し、右のパラメーターに対して別の型を取得することです。あなたも言いたいと思っていると思いますadd(setOfLong, 0)が、そのテンプレートではできませんでした。これを解決するには、別のテンプレート パラメータを追加することをお勧めします

template <class SetV, class V>
void add(const Set<SetV>& set, const V& value) {}
于 2010-06-25T22:33:52.070 に答える
1

この問題を解決する別の方法があります (どこで見たかは忘れてください...)。

「Identity」型ラッパーを使用して、コンパイラが推論を実行するときに型を考慮しないようにすることができます。

template <T>
struct Identity {
   typedef T type;
};

次に、次のように「追加」を定義します。

template <class V>
void add(const Set<V>& set, const typename Identity<V>::Type& value) {}

これにより、'V' は最初の引数の型のみに基づいて推測されます。それが決定されると、先に進み、それを 2 番目の引数に使用します。これは正常に機能します。

于 2010-08-24T08:57:00.863 に答える