C++ 方法指针调用产生未定义的符号错误?

C++ method pointer call yields undefined symbol error?

我想要一个 class,它有一个方法指针指向同一个 class 的两个可能方法之一。为此,我使用 Embarcadero XE2 bcc32。

当我尝试以下操作时,出现错误 E2451 Undefined symbol findPosition:

class A{
    public:
        double (A::*findPosition)(std::vector<int> arr, int tresh); //method pointer
        double mean(std::vector<int> arr, int tresh){return 0;};               //case 1
        double median(std::vector<int> arr, int tresh){return 0;};             //case 2
        A(){findPosition=&(A::mean);}                               //constructor set pointer to case 1
};
int _tmain(int argc, _TCHAR* argv[])
{
    std::vector<int> vals(5,1);   // 1 1 1 1 1, example input

    A obj;
    obj.findPosition=&(A::median);   //set method pointer to case 2
    (obj.*findPosition)(vals,0);     //ERROR: E2451 Undefined symbol 'findPosition'

    system("pause");
}

(obj.*findPosition)(vals,0) 不是方法指针调用的正确版本吗?我应该使用 boost:bind 吗?或者这通常是个坏主意,我应该坚持

class A{
    public:
        int flag;
        double findPosition(std::vector<int> arr, int tresh){
            if(flag==0)return mean(arr,tresh);
            else if(flag==1)return median(arr,tresh);
        };
        double mean(std::vector<int> arr, int tresh){return 0;};               //case 1
        double median(std::vector<int> arr, int tresh){return 0;};             //case 2
        A(){flag=0;}                               //constructor set use to case 1
};

.*->*运算符定义如下:

expression .* expression
expression ->* expression

其中右侧表达式的计算结果必须为指向左侧表达式指定的对象内成员的指针。

代码编译失败,因为您试图为右侧表达式传入一个不存在的局部变量。那个丢失的变量是编译器抱怨的。

您需要更多类似的东西:

(obj.*obj.findPosition)(vals,0);

或者,更清楚:

(obj.*(obj.findPosition))(vals,0);

或者,更详细一点:

double (A::*fp)(std::vector<int>, int) = obj.findPosition;
(obj.*fp)(vals,0);

也就是说,如果您不担心对其他编译器的可移植性,您可以改用 BCC 的 __closure 扩展:

class A{
    public:
        double (__closure *findPosition)(std::vector<int> arr, int tresh); //method pointer
        double mean(std::vector<int> arr, int tresh){return 0;};               //case 1
        double median(std::vector<int> arr, int tresh){return 0;};             //case 2
        A(){findPosition=&mean;}                               //constructor set pointer to case 1
};

int _tmain(int argc, _TCHAR* argv[])
{
    std::vector<int> vals(5,1);   // 1 1 1 1 1, example input

    A obj;
    obj.findPosition=&(obj.median);   //set method pointer to case 2
    obj.findPosition(vals,0);

    system("pause");
}