部分特化 C++

问题描述

美好的一天!

我正在尝试构建一个模板类,它具有如下几个部分特化:

#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:1Bar<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?