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