0
#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:这个标题是我老师给的,作为作业我必须实现这些方法

4

2 回答 2

3

这是一个愚蠢的警告信息。它不是未指定的,但是const您对第二个参数的限定registerFunction将被忽略。

让我们看一下typedefcreateShapeFunction

typedef Shape *(createShapeFunction)(void);

您可以将此类型理解为“一个不带参数并返回一个”的函数Shape*。那么你有一个这种类型的参数:

const createShapeFunction*

这将是一个指向const函数类型的指针。没有const函数类型这样的东西,所以const被忽略并且参数类型等价于createShapeFunction*. 也就是指向上面定义的函数类型的指针。

您可能打算createShapeFunction成为函数指针类型本身:

typedef Shape *(*createShapeFunction)(void);

现在您可以将此类型理解为“指向不带参数并返回的函数的指针Shape*”。然后这将使参数const createShapeFunction*成为指向const函数指针的指针。

于 2013-03-28T17:09:06.477 回答
0

发出警告是因为该类型const createShapeFunction*试图创建一个const-qualified 函数类型(因为createShapeFunction它被定义为返回 aShape*并且不接受任何参数的函数的类型)。这就是 C++11 标准对此的看法(第 8.5.3/6 段):

函数声明器中 cv-qualifier-seq 的效果与在函数类型之上添加 cv-qualification 不同。在后一种情况下,cv 限定符被忽略。[ 注意:具有 cv-qualifier-seq 的函数类型不是 cv-qualified 类型;没有 cv 限定的函数类型。—尾注] [示例:

typedef void F();
struct S {
    const F f; // OK: equivalent to: void f();
};

—结束示例]

因此,编译器会警告你,你的意思可能不是你实际写的,因为const函数类型的限定将被忽略。

于 2013-03-28T17:21:50.447 回答