【发布时间】:2021-11-18 10:12:54
【问题描述】:
我尝试编译以下代码。
#include <iostream>
class Base
{
public:
template <typename T>
T fun()
{
std::cout<<"CALLED!"<<std::endl;
return T();
}
};
class Derived : public Base
{
};
template<class T>
T (Derived::*func_ptr)() = &Base::fun;
int main()
{
Derived d;
///how to call?
}
令我惊讶的是,这在 clang 和 gcc 中都编译了。这让我想到,我们应该能够通过func_ptr 调用fun。但是,我想不出通过这个指针调用函数的语法应该是什么。它的语法是什么?如何解释?
另外一件事是,我想不出编译的原因。 C++ 标准中在哪里定义了这种行为?
【问题讨论】:
-
编译,但行为未定义,因为
fun缺少return -
我想不出用这个指针调用函数的语法应该是什么。如果你不知道如何使用指向成员的指针或如何传递模板的参数,阅读一些 C++ 介绍书。
-
调用成员指针的语法是
(o.*f)()。在这种情况下,对象是d,函数指针是func_ptr<T>,对于某些类型T。没有什么特别模棱两可或语言法律问题。 -
无论你用什么书来学习 C++,当它告诉你如何声明一个指向成员函数的指针,但没有告诉你如何使用它时,这对你造成了伤害。
标签: c++ templates inheritance language-lawyer member-function-pointers