指向函数的指针无法编译
Pointer to function won't compile
//mediafactory.h
class MediaFactory{
public:
typedef Media* (*funPointer)();
funPointer somePointer;
}
//mediafactory.cpp
Media* MediaFactory::returnMedia(){
}
当我尝试做
somePointer = returnMedia;
我收到此错误:
1 IntelliSense: a value of type "Media *(MediaFactory::*)()" cannot be assigned to an entity of type "MediaFactory::funPointer" c:Users...mediafactory.cpp 37
但是,如果我将函数更改为下面的代码,它将编译并工作
Media* returnMedia(){ //without scope
}
MediaFactory::returnMedia()
是一个 非静态成员函数,只能通过MediaFactory
的实例调用。
typedef Media* (*funPointer)();
定义指向静态或非成员函数的指针,该函数在没有任何对象的情况下调用。因此,它是一种不同的类型,与指向成员函数的指针不兼容。
如果不需要它指向成员函数,则returnMedia()
设置为静态或非成员(如问题末尾所述)。
如果确实需要它指向成员函数,则需要指向成员的指针:
typedef Media* (MediaFactory::*funPointer)();
可以设置为指向成员函数:
somePointer = &MediaFactory::returnMedia;
并且可以在工厂对象上调用:
Media * media = (someFactory.*somePointer)();
或者,您可能希望在设置指针时(而不是在使用它时)将函数指针绑定到对象。在这种情况下,您可以使用std::function
(如果您坚持使用过时的编译器,则可以使用 boost::function
)来存储任意可调用对象:
typedef std::function<Media*()> function;
function someFunction;
someFunction = std::bind(&MediaFactory::returnMedia, &someFactory);
Media * media = someFunction();
如果没有此类的实例,则不能将类的方法分配给全局函数指针。
相关文章:
- 非类型指针和引用模板参数,以及在编译时如何/为什么解析它们.c++
- 模板方法访问正向声明的类仅在没有此指针的情况下无法编译
- 编译器不会使用 -std=c++11 编译智能指针
- 为什么通过指针编译时不能分配 const 初始化
- std::less是否应该允许在编译时比较不相关的指针?
- 对带有唯一指针的 std::thread 使用类成员函数时出现编译错误
- 是否可以在编译时初始化对象的 C 样式函数指针,以便它调用对象的成员函数?
- 编译包含指向模板函数的指针的初始值设定项列表时,gcc 出错,但 clang 不出错
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- 通过在编译时折叠带有索引的指针来分配 C 数组
- 使用指针编译代码后,.cpp文件将变为随机字符
- 如何在编译时创建具有函数签名的函数指针
- 类数据成员指针的非类型模板参数包无法使用 gcc 编译
- 'void *' 'void (*) (bool)' 指针使用 c ++ 编译器在 C 中编译文件的错误
- 唯一指向非指针编译错误
- 在编译时以增量方式构建变量指针的向量
- 如何创建指向派生类的新指针,该派生类在C++编译时未知
- 指向功能编译错误的指针
- 在编译时将函数指针转换为 std::uintptr_t
- C++编译并链接到指向未定义函数的指针