部分专业化 C++
Partial specialization C++
美好的一天!
我正在尝试构建一个模板 class,它具有如下几个部分特化:
#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, int dim>
struct A<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 个特化编译失败。我不明白为什么会这样。您能否提示一下在哪里可以了解它发生的原因以及可能的解决方案?
Bar<dim>::Sub
和 dim
之间没有 1:1
关系,因为 Bar<dim>
和 dim
之间存在 1:1
关系。
假设你是编译器。
我告诉你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?.
美好的一天!
我正在尝试构建一个模板 class,它具有如下几个部分特化:
#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, int dim>
struct A<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 个特化编译失败。我不明白为什么会这样。您能否提示一下在哪里可以了解它发生的原因以及可能的解决方案?
Bar<dim>::Sub
和 dim
之间没有 1:1
关系,因为 Bar<dim>
和 dim
之间存在 1:1
关系。
假设你是编译器。
我告诉你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?.