Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过运算符()调用类模板成员函数指针_C++_Member Function Pointers_Class Template - Fatal编程技术网

C++ 通过运算符()调用类模板成员函数指针

C++ 通过运算符()调用类模板成员函数指针,c++,member-function-pointers,class-template,C++,Member Function Pointers,Class Template,我有一套课程;一个是template,并接受其他两个类作为其模板参数。类模板有一个函数指针成员,该成员将指向T类的函数。我试图通过类的操作符()()调用函数调用 到目前为止,我的代码是这样的: template<class T> class A { private: T* ptrT{ nullptr }; public: explicit A( T t ) : ptrT( &t ) {} void(T::*func)(); void ope

我有一套课程;一个是template,并接受其他两个类作为其模板参数。类模板有一个函数指针成员,该成员将指向
T
类的函数。我试图通过类的
操作符()()
调用函数调用

到目前为止,我的代码是这样的:

template<class T>
class A {
private:
    T* ptrT{ nullptr };
public:
    explicit A( T t ) : ptrT( &t ) {}

    void(T::*func)();

    void operator()() {
        (ptrT->*func)();
    }    
};

class B {
    int ib{2};
public:
    void func() {
        std::cout << ib << '\n';
    }
};

class C {
    int ic{6};
public:
    void func() {
        std::cout << ic << '\n';
    }
};

int main() {
    try {
        B b;
        C c;
        A<B> a1( b );
        A<C> a2( c );
        a1.func = &B::func;
        a2.func = &C::func;

        a1();
        a2();   

    } catch( std::runtime_error& e ) {
        std::cerr << e.what() << std::endl;
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;    
}
我知道要获得实际值,我必须遵从一些东西,但由于类成员函数指针的语法有点模糊,我不知道需要遵从什么,也不知道正确的语法。。。我将感谢任何帮助

在评论中提供了我缺少的东西。它与成员函数指针的语法无关,也与如何调用或遵从它们以获得正确的值无关

这是一件我忽略或错过的简单事情。问题或问题出现在我的类模板的构造函数中。我传递的是值而不是引用,因此得到的是
UB
。它正在复制本地副本的地址并将其保存到成员指针中。修复上述代码所需的全部更改如下:

我必须改变这一点:

explicit A( T t ) : ptrT( &t ) {}
为此:

explicit A( T& t ) : ptrT( &t ) {}

现在一切都按预期进行,我现在得到了正确的结果。

A
的构造函数中,您的参数
T
是按值传递的。您正在获取局部变量的地址并将其保存到
ptrT
中。由于未定义的bahavior,您得到的结果是垃圾。我想这是对@user10605163-hmm的打字错误。。。我将尝试通过引用传递,看看这是否有什么区别。@user10605163就是这样做的!我有一种感觉,这是一件我错过或忽略的简单事情。这不是打字错误;我只是没有考虑将本地副本传递到构造函数中,而不是通过引用传递。我更关注成员函数指针语法,而忽略了更简单的东西。
explicit A( T& t ) : ptrT( &t ) {}