部分专业化 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>::Subdim 之间没有 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?.