我想写这个代码,但它产生了一个错误。
template<int N>
struct A {
struct B {
};
B f() { return B{}; }
};
template<typename T>
constexpr bool val = false;
template<int N>
constexpr bool val<typename A<N>::B> = true;
error: template parameters not deducible in partial specialization:
13 | constexpr bool val<typename A<N>::B> = true;
当代码运行良好时
template<int N> struct A;
template<int N>
struct AB {
};
template<int N>
struct A {
AB<N> f() { return AB<N>{}; }
};
template<typename T>
constexpr bool val = false;
template<int N>
constexpr bool val<AB<N>> = true;
我知道C++必须检查是否存在N
,使得T
等于A<N>::B
时,这太难了。这就是为什么有一个错误。但我的问题是有没有办法将结构体B保留在A中,并为每个N
定义值val<A<N>::B>
?
如果B被定义为对A外部的结构体的引用(例如using B = int;
),我可以理解这个错误,但如果B是在A内部定义的结构体,那么就没有歧义,N
很容易推导出来。
1条答案
按热度按时间s4n0splo1#
最简单的解决方案是在类之外定义它,并且在类中有一个类型别名来正常使用它:
这与嵌套的
struct B
几乎没有什么区别。