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、2 番目の引数に付けた修飾はregisterFunction無視されます。

typedefを見てみましょうcreateShapeFunction:

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

型が-qualified 関数型const createShapeFunction*を作成しようとしているため、警告が発行されています (は a を返し、引数を受け入れない関数の型として定義されているため)。これは、C++11 標準がそれについて述べなければならないことです (パラグラフ 8.5.3/6):constcreateShapeFunctionShape*

関数宣言子での cv-qualifier-seq の効果は、関数型の上に cv-qualification を追加することと同じではありません。後者の場合、cv 修飾子は無視されます。[ 注: cv-qualifier-seq を持つ関数型は cv 修飾された型ではありません。cv 修飾された関数型はありません。—終わりのメモ] [例:

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

—終わりの例]

constしたがって、コンパイラは、関数型の修飾が無視されるため、実際に記述したものではなく、別の意味である可能性があることを警告しています。

于 2013-03-28T17:21:50.447 に答える