可以从专门的模板类调用非专门的模板类中定义的函数吗?以下是我正在尝试的例子:
template <typename T> struct Convert { static inline void toString(unsigned num,unsigned places,std::string& str) { ... } }; template <> struct Convert<int8_t> { static inline void toString(unsigned num,std::string& str) { Convert<int8_t>::toString(num,digitis(num),str); } };
GCC抱怨说它看不到非专业的类功能;我猜这只是在专门的课堂里.
有什么想法吗?
编辑
struct NonSpecial { }; template <typename T> class Convert { template <typename R> static inline R fromString(const register char *str,const unsigned str_len) { R result = 0; //convert str to R return result; } friend class Convert<int8_t>; friend class Convert<uint8_t>; } template <> struct Convert<int8_t> { static inline int8_t fromString(const register char* str,const unsigned str_len = 4) { Convert<NonSpecial>::fromString<int8_t>(str,str_len); } }; template <> struct Convert<uint8_t> { static inline uint8_t fromString(const register char* str,const unsigned str_len = 3) { Convert<NonSpecial>::fromString<uint8_t>(str,str_len); } };
我有其他的功能 – toString(),countDigits()等.我选择了这种方法,所以我可以保持每个类型相同的函数名称(即不需要toStringU32(),toString32等).我认为模板专业化,但我不相信这是可能的.
解决方法
一般来说,这是不可能的.
有不同的可能的解决方案,但他们“欺骗”.第一个是将实际的默认逻辑提升为不专业的不同功能.现在您可以从toString实现调用此函数.
第二种方法需要从非专业类继承,并传递一个特殊的标签作为模板参数:
struct BaseClassTag { }; template <> struct Convert<int8_t> : public Convert<BaseClassTag> { typedef Convert<BaseClassTag> TBase; static inline void toString(unsigned num,std::string& str) { TBase::toString(num,str); } };