2016-08-04 66 views
3

我有一个需要访问其模板类型的特征的通用算法。有一个特质类可以专门用于提供这些特征。私有类型的模板专精

在我的课堂中使用这个算法时,我想使用它在类中定义的私有类型。

但是,专业化只能发生在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类?

回答

4

您可以通过template friend declaration使课堂模板TraitA的朋友。

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>; 
}; 
+0

宾果!正是我需要的:-)。谢谢。 –

+0

@AdiShavit不客气。 :) – songyuanyao

+0

@AdiShavit如果它解决了你的问题,你应该接受这个答案。 – Brian