更具体的模板推导

More specific template deduction

我有主模板和三个偏特化,编译器认为它们不明确:

#include <vector>

template<typename ... ARGS>
struct queryBuilder;

template<typename INTERNALDATA,
         template<typename> typename ICONTAINER,
         template <typename> typename ECONTAINER>
struct queryBuilder<ECONTAINER<ICONTAINER<INTERNALDATA>>>
{ };

template<typename PARAM,
         template<typename> typename T>
struct queryBuilder<T<PARAM>>
{ };

template<typename PARAM1,
         typename PARAM2,
         template<typename,typename> typename T>
struct queryBuilder<T<PARAM1, PARAM2>>
{ };

template<typename T>
struct queryBuilder<T>
{ };

int main() {
  queryBuilder<std::vector<std::vector<int>>> q; // error: ambiguous
}

我正在使用 g++ 7.3.0 和 -std=c++17。

如果我们按照评论中的建议,在第一个专业化中为两个容器提供分配器参数,一切都会很好。

我们在此处匹配三个特化(感谢 new rules in C++17 允许使用默认参数):

1) A<B<C>> (with A = std::vector, B = std::vector, C = int)
2) A<B>    (with A = std::vector, B = std::vector<int> )
3) A<B,C>  (with A = std::vector, B = std::vector<int>, C = std::allocator<int>)

其中哪一个比其他的更专业?好吧,#1 比#2 更专业(因为 any 单个参数在 #2 中有效,但只有 class 具有一个参数的模板特化在 #1 中有效),所以这很好.

但#1 和#3 都不是更专业的 - As 采用不同数量的模板参数,因此无法正常工作。出于同样的原因,#2 和#3 都不是更专业。

由于您不能说出这些案例中哪个是 特化的,因此推论是不明确的。你真的可以指其中任何一个。

你需要重新考虑你在这里做的专业。