#ifndef SHAPEFACTORY_H_
#define SHAPEFACTORY_H_
#include <istream>
#include <map>
#include <string>
#include "shape.h"
typedef Shape *(createShapeFunction)(void);
/* thrown when a shape cannot be read from a stream */
class WrongFormatException { };
class ShapeFactory {
public:
static void registerFunction(const std::string &string, const createShapeFunction *shapeFunction);
static Shape *createShape(const std::string &string);
static Shape *createShape(std::istream &ins);
private:
std::map<std::string, createShapeFunction *> creationFunctions;
ShapeFactory();
static ShapeFactory *getShapeFactory();
};
#endif
这是标题,我还没有实现任何方法,但我收到以下警告:
Qualifier on function type 'createShapeFunction' (aka 'Shape *()') has unspecified behavior
ps:这个标题是我的老师给出的,作为一个家庭作业,我必须实现方法
答案 0 :(得分:3)
这是一个愚蠢的警告信息。它没有被指定,但是你对const
的第二个参数的registerFunction
限定将被忽略。
让我们看看typedef
的{{1}}:
createShapeFunction
您可以将此类型读作“不带参数并返回typedef Shape *(createShapeFunction)(void);
”的函数。那么你有一个这种类型的论点:
Shape*
这是指向const createShapeFunction*
函数类型的指针。没有const
函数类型,因此const
被忽略,参数类型等同于const
。也就是说,指向上面定义的函数类型的指针。
你可能意味着createShapeFunction*
本身就是一个函数指针类型:
createShapeFunction
现在您可以将此类型读作“指向不带参数的函数并返回typedef Shape *(*createShapeFunction)(void);
”的指针。然后,这将使参数Shape*
成为指向const createShapeFunction*
函数指针的指针。
答案 1 :(得分:0)
正在发出警告,因为类型const createShapeFunction*
尝试创建const
限定的函数类型(因为createShapeFunction
被定义为返回{{1}的函数的类型并且不接受任何参数)。这就是C ++ 11标准所说的(第8.5.3 / 6段):
cv-qualifier-seq在函数声明符中的作用与在顶部添加cv-qualification不同 功能类型。在后一种情况下,忽略cv限定符。 [注意:有一个函数类型 cv-qualifier-seq不是cv限定类型;没有cv限定的函数类型。 - 尾注] [例子:
Shape*
-end example]
因此,编译器警告您,您可能意味着其他内容而不是您实际编写的内容,因为函数类型的typedef void F();
struct S {
const F f; // OK: equivalent to: void f();
};
资格只会被忽略。