函数指针和继承

时间:2012-09-18 17:09:56

标签: 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是包含对象列表的Class,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:抱歉我的英语不好

2 个答案:

答案 0 :(得分:0)

您似乎同时尝试将T2约束为Vendeur trie Vendeur Vendeurs::getVend(quint16)(因为Personne)和&Vendeur::getNom in {第三个参数(但我不知道它是如何从Qstring Personne::function()传递到{{1}}的,除非涉及某些继承或其他事情)。您可能需要发布一些代码(特别是类定义)。

答案 1 :(得分:0)

&Vendeur::getNom,尽管可以通过Vendeur访问,但似乎有QString (Personne::*)()类型。这会在模板参数推断期间使T2不明确:它是Vendeur还是Personne

创可贴修复方法是将trie的来电负担明确地转换为QString (Vendeur::*)(),从而导致以下调用:

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

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

更好的解决方案是在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::*)()