假设我有以下模板类来定义嵌套类:
template <typename T>
struct foo {
struct bar { };
};
Run Code Online (Sandbox Code Playgroud)
假设我编写的环境也有以下帮助器类,它应该专门用于需要特殊处理的任何类型:
template <typename T>
struct maybeChangeType { using type = T; } /* default: same type */
Run Code Online (Sandbox Code Playgroud)
我怎么能专门maybeChangeType为foo<T>::bar?比如说,它很容易专门用于,foo<int>::bar但foo将会使用100多个不同的,T所以这不是一个真正的选择.
注意:在将此问题标记为重复之前,请仔细阅读.这个问题并不是要问如何专注于一般(例如,在c ++中理解模板),或如何声明朋友,甚至如何声明模板的朋友.它询问如何为模板类的非模板嵌套成员声明朋友(如标题所述).
尝试以"正常"方式定义专业化不起作用,因为foo<T>::bar它不是可推导的上下文(坏符号:它需要typename在前面):
/* error: template parameters not deducible in partial specialization */
template <typename T>
struct maybeChangeType<typename foo<T>::bar>;
Run Code Online (Sandbox Code Playgroud)
将专业化声明为朋友也会产生编译错误:
template <typename T>
struct foo {
struct bar {
/* errors:
* …Run Code Online (Sandbox Code Playgroud)