问题描述
美好的一天!
我正在尝试构建一个模板类,它具有如下几个部分特化:
#include <iostream>
struct MainT {};
struct Foo {};
template <int dim>
struct Tensor {};
template <int dim>
struct Bar {
using Sub = Tensor<dim>;
};
template<typename T,typename R>
struct A {
A() { std::cout << "A<T,R>" << std::endl; }
};
template<typename T>
struct A<T,Foo> {
A() { std::cout << "A<T,Foo>" << std::endl; }
};
template<typename T,int dim>
struct A<T,Bar<dim>> {
A() { std::cout << "A<T,Bar<dim>>" << std::endl; }
};
template<typename T,typename Bar<dim>::Sub> {
A() { std::cout << "A<T,Bar<dim>::Sub>" << std::endl; }
Tensor<dim> t;
};
int main() {
A<MainT,double> a1; // OK
A<MainT,Foo> a2; // OK
A<MainT,Bar<2>> a3; // OK
A<MainT,Bar<2>::Sub> a4; // error: template parameters not deducible in partial specialization,note: 'dim'
return 0;
}
第 4 专业化无法编译。我不明白为什么这样做。能否请您提供一个提示,告诉您在哪里查看以了解它发生的原因以及可能的解决方案?
解决方法
1:1
和 Bar<dim>::Sub
之间没有 dim
关系,因为 Bar<dim>
和 dim
之间有。
假设您是一名编译器。
我告诉你Bar<2>
,然后你就知道“啊好吧,他们想要dim=2
”。也就是说:给定 Bar<2>
,你可以推导出 dim=2
。
我告诉你 Tensor<42>
,那么你不可能知道我实际上指的是别名为 Tensor<42>
的 Bar<42>::Sub
。可能是 Bar<24>::Sub
,通过特化,是完全相同的类型。
更正式地说,正如 SergeyA 在评论中提到的,Bar<dim>::Sub
是所谓的非推导上下文。详情请参阅What is a nondeduced context?。