我想用2个模板参数定义一个模板类:
-
指针类型T *
-
指向基础类型T的成员函数的指针
另外我想为函数参数设置一个默认方法 .
// Do not allow SortedLinkedList<T>
template<typename T, bool (T::* comparisonMethod)(const T&) = &T::lessEqual>
class SortedLinkedList
{
private:
SortedLinkedList();
};
// Allow SortedLinkedList<T*>
template<typename T, bool (T::* comparisonMethod)(const T&)>
class SortedLinkedList<T*>
{
public:
void insert(T* item)
{
// do something with /item->*comparisonMethod)(...))
}
};
此代码无法编译,因为g(4.4.3)无法推断 T*
的基础类型
error: creating pointer to member function of non-class type ‘T*’
有没有办法推断出类声明中已有的基础类型? decltype
在C 03中不可用,我不知道它是否适用于这个地方 .
我找到this answer,但在这种情况下没有帮助 .
谢谢
1 回答
问题
它无法编译的原因是编译器将检查主模板是否可行匹配 before 继续查看是否有任何特殊化是更合适的替代方案 .
这意味着当您尝试实例化
SortedLinkedList<A*>
时,编译器会尝试查看主模板中的声明bool (T::* comparisonMethod)(const T&) = &T::lessEqual
是否具有T = A*
的格式良好 - 显然它不具有成员函数't (since pointers can' .解决方案
解决此问题的一种方法是添加一个间接级别,以便主模板和特化 - 产生一个格式良好的实例化 .