c++ - 函数指针和继承

标签 c++ qt templates inheritance

我有一个通用函数用于对 List 类中的某些对象进行排序。

这个函数工作得很好,但是当我想使用一个指向该类中成员函数的函数指针将这个函数应用到一个类时,它不会构建。

函数是:

template <typename T1, typename T2, typename T3>
void DialogFaitListing::trie(T1 * list, T2 (T1::*fx)(quint16), T3 (T2::*crit)())
{
    for(int i(0);i<list->count();i++)
    {
        for(int j(i);j<list->count();j++)
        {
            if((((list->*fx)(i)).*crit)() > (((list->*fx)(j)).*crit)())
            {
                list->swap(i,j);
            }
        }
    }
}

其中 list 是包含对象列表的类,fx 是访问对象的函数指针,crit 是用于排序的对象比较函数。

当我使用这条线构建时:

trie(vend,&Vendeurs::getVend,&Vendeur::getNom);

我收到这个错误:

dialogfaitlisting.cpp:459: erreur : no matching function for call to 
'DialogFaitListing::trie(Vendeurs*&, Vendeur (Vendeurs::*)(quint16), 
QString (Personne::*)())'

ps:抱歉我的英语不好

最佳答案

&Vendeur::getNom,尽管是可通过 Vendeur 访问的成员,但似乎具有类型 QString (Personne::*)() .这使得 T2 在模板参数推导过程中变得模棱两可:是 Vendeur 还是 Personne

一个创可贴的修复方法是让 trie 的调用者负担明确地将其转换为 QString (Vendeur::*)(),导致以下调用:

trie(vend, &Vendeurs::getVend, static_cast<QString (Vendeur::*)()>(&Vendeur::getNom));

这是非常冗长和不方便的,考虑到每次我们希望传递的 criterion 来自基类时,我们很可能会发现相同的错误。

更好的解决方案是在 T2 出现的两个位置之一禁止模板参数推导。我认为为此选择第二个位置是有意义的:

template<typename T>
struct identity { typedef T type; };

template <typename T1, typename T2, typename T3>
void trie(T1 * list
     , T2 (T1::*fx)(quint16)
     , T3 (identity<T2>::type::*crit)());

然后在调用中T2只能被推断为Vendeur并且&Vendeur::getNom会被隐式转换为QString (Vendeur::*)().

关于c++ - 函数指针和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12481795/

相关文章:

c++ - 未在基类模板中声明成员

c++ - 提取函数的返回类型而不调用它(使用模板?)

android - 如何更改qt android应用程序的默认应用程序图像

c++ - 为什么在Qt中创建主窗口之前必须加载语言包?

c++ - 我可以使用 FILE* 来初始化 C++ ostream 对象吗?

c++ - 使用类中的枚举 (C++)

python - 使用 self.sender() 检查 PyQt QPushButton 是否被检查

templates - 根据 thymeleaf 中的其他变量选择上下文变量属性(动态)

c++ - 删除不需要的字符

c++ - 在给定指向该元素的指针的情况下获取双端队列中元素的索引?