1

我有一个通用函数,用于对 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:对不起我的英语不好

4

2 回答 2

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中只能推断为 beVendeur并将&Vendeur::getNom被隐式转换为QString (Vendeur::*)().

于 2012-09-18T18:07:54.640 回答
0

您似乎同时试图限制T2Vendeur第二个参数中trie(因为Vendeur Vendeurs::getVend(quint16))和Personne第三个参数(但我不知道它是如何从&Vendeur::getNomto得到的Qstring Personne::function(),除非涉及到一些继承或其他东西)。您可能需要发布比这更多的代码(特别是类定义)。

于 2012-09-18T17:44:41.160 回答