【发布时间】:2021-12-17 03:41:07
【问题描述】:
我有类 foo_impl、bar_impl 派生自派生类 foo_derived、bar_derived,以及一个接受模板化模板参数的函数:
#include <iostream>
template <typename T>
struct foo_base
{
T a;
};
template <typename T>
struct foo_derived: public foo_base<T>
{
};
struct foo_impl: public foo_derived<int>
{
};
template <typename T>
struct bar_base
{
T a;
};
template <typename T>
struct bar_derived : public bar_base<T>
{
};
struct bar_impl : public bar_derived<int>
{
};
template <typename T, template <class> typename Base>
void useBase(const Base<T>& Arg)
{
std::cout << Arg.a << std::endl;
}
int main()
{
foo_impl foo;
bar_impl bar;
useBase(foo); // ‘const Base<T>’ is an ambiguous base class of ‘foo_impl’
useBase(bar); // ‘const Base<T>’ is an ambiguous base class of ‘bar_impl’
}
是否可以指定我希望 foo_base 和 bar_base 是唯一可以传递给 useBase(.) 的类型?
编辑:我尝试引入一个概念以限制接受的类型,但编译器仍然不满意。
template <typename T, template <class> typename Base>
concept is_base = !std::is_same<std::is_same<Base<T>, foo_base<T>>, std::is_same<Base<T>, bar_base<T>>>::value;
template <typename T, template <class> typename Base>
void useBase(const Base<T>& Arg) requires is_base<T, Base>
{
std::cout << Arg.a << std::endl;
}
【问题讨论】:
-
您能否详细说明为什么在
useBase()中需要Base?是因为你想用不同的参数重新实例化同一个模板吗? -
为 foo_base 和 bar_base 重载 usebase。
-
@JonasHjulstad。所以要禁止上面两个
useBase被调用? -
您可以分解并调用通用实现。
标签: c++ templates inheritance ambiguous