C++ 从带有自动参数的模板类继承时基类不明确

C++ 从带有自动参数的模板类继承时基类不明确,c++,C++,给定代码 #include <type_traits> template <auto I, class T> struct C {}; template <auto I, class T> void func(C<I, T> c) {} struct C2 : C<0, int>, C<0u, long> {}; int main() { static_assert(!std::is_same<C&l

给定代码

#include <type_traits>

template <auto I, class T>
struct C {};

template <auto I, class T>
void func(C<I, T> c)  {}

struct C2 : C<0, int>, C<0u, long> {};

int main() {
    static_assert(!std::is_same<C<0, int>, C<0u, long>>::value);

    C2 c2;
    func<0>(c2);  // Error

    return 0;
}
#包括
模板
结构C{};
模板
void func(C){}
结构C2:C,C{};
int main(){
静态断言(!std::is_same::value);
C2;
func(c2);//错误
返回0;
}
我(从GCC)得到错误:

:15:15:注意:'C'是'C2'的一个模棱两可的基类
15 | func(c2);
|               ^
当实例化(
C
C
)是明显不同的类型时,类模板(
C
)为什么会是不明确的基类


编辑:我忘记了部分专门化。

错误消息可能会稍微好一点。但问题在于如何解决问题。理论上可以从
C2
合成两种可能的重载:

void func(C<0, int> c)  {}
void func(C<0u, long> c)  {}
然后打电话

func<int>(c2); 
func(c2);
当实例化(
C
C
)是明显不同的类型时,类模板(
C
)为什么会是不明确的基类

问题在于它们是不同的类型
C2
继承自这两个基类,并且模板
func
接受这两个基类-编译器应该选择哪一个

在将
c2
传递给
func
时,您可以明确说明应使用
c2
的哪一部分,这解决了问题:

func(static_cast<C<0, int>>(c2));  // Works fine now
func(静态_cast(c2));//现在一切正常

在来回试验时,我忘记了调用'func'时的部分专门化。我现在已经把它编辑成问题了。恐怕这会稍微改变问题,所以如果需要的话,如果你能修改你的答案,我将不胜感激。我想现在的问题是为什么编译器不能根据
0
的类型选择重载。在来回试验时,我忘记了调用` func `时的部分专门化。我现在已经把它编辑成问题了。恐怕这会稍微改变问题,所以如果需要的话,如果你能修改你的答案,我将不胜感激。我想现在的问题是为什么编译器不能根据
0
的类型选择重载。
func<int>(c2); 
func(static_cast<C<0, int>>(c2));  // Works fine now