Чтобы определить друга шаблонного класса с аргументом по умолчанию, вам нужно указать всех друзей, как в приведенном ниже коде (который работает)?
// Different class implementations
enum ClassImplType { CIT_CHECK, CIT_FAST, CIT_GPU, CIT_SSE, CIT_NOF_TYPES } ;
// Graph class has default template argument CIT_CHECK
template <typename T, ClassImplType impl_type = CIT_CHECK>
class graph {
//...
};
// Vertex class
template <typename T>
class vertex {
//...
friend class graph<T, CIT_CHECK>;
friend class graph<T, CIT_FAST>;
friend class graph<T, CIT_GPU>;
friend class graph<T, CIT_SSE>;
};
Я могу себе представить, что существует более короткий способ обозначить, что друг определен для всех возможных значений перечисления ClassImplType. Что-то вроде friend class graph<T, ClassImplType>
, но последнее не работает, конечно.
Извините, если используемая терминология неверна.