我有一个通用算法需要访问其模板类型的特征。有一个特质类可以专门用于提供这些特征。
在我的课程中使用此算法时,我希望将其与类中定义的私有类型一起使用。
但是,专业化只能在我的班级无法访问的namespace
或全球范围内发生。
class A
{
struct Secret
{};
};
template <typename T> struct Trait {};
// Inaccessible type ----vvvvvvvvv
template <> struct Trait<A::Secret> // Specialize for PRIVATE type A::Secret
{
A::Secret magic_value() { return{}; } // ERROR: 'A::Secret': cannot access private struct declared in class 'A'
};
是否有可能以某种方式使用私有类型专门化模板,至少在可以访问此类型的范围内?
也许可以将专业化声明为friend
类?
答案 0 :(得分:5)
您可以通过template friend declaration将班级模板A
作为班级template <typename T> struct Trait {};
class A
{
struct Secret
{};
template <typename T>
friend struct Trait;
};
的朋友。
A::Secret
或者参考template <typename T> struct Trait {};
class A
{
struct Secret
{};
friend struct Trait<A::Secret>;
};
。
{{1}}