0

引数が特定の最初のテンプレート パラメーター (任意にテンプレート化された) を持つ特定のテンプレートである場合、計算を行う特定の関数が必要です。

これらのクラスを検討してください

template<class S> struct A { };
template<class S> struct B { };
template<class S> struct C { };
template<class S, class U = B<S>> struct D { };

を使用して目標を達成しようとしました

template<template<class ... X> class Y, class Z>
inline void foo(Y<A<Z>> const &av) { std::cout << "2\n"; }

問題: MSVS 2013 は を推測できませんY

int main()
{
  foo(C<A<int>>()); // prints 2 as intended
  foo(D<A<int>>()); // does NOT compile in VS 2013
  return 0;
}

エラーの理由 (MSVS による) は次のとおりです。

テンプレート - の引数はからconst Y<A<Z>> &推定できません。D<A<int>, B<S>>S=A<int>

私の目標は、特定の型を処理するオーバーロード / 特殊化を作成することですYY::value_type/ の最初のテンプレート パラメーターは、foo のシグネチャを保持するY任意の場所にすることができます。A<T>void foo (Y const &);

これは MSVS のバグですか (foo(D<A<int>>());実際には g++ を使用して 2 を出力するため)、何か不足していますか?

PS: 気になる方はメリークリスマス...

4

1 に答える 1

3

D<A<int>, B<S>>ではないY<A<Z>>場合、追加のパラメーターを追加する必要があります。

template<template<class...> class Y, class Z, typename ... Ts>
inline void foo(Y<A<Z>, Ts...> const &av) { std::cout << "2\n"; }

Ts...空にできる場所。

別の方法は、エイリアスを作成することです。

template <typename T>
using E = D<A<T>>;

その後

foo(E<A<int>>()); // OK, but still can't use foo(D<A<int>>());
于 2014-12-25T05:13:11.133 に答える