0

別のクラスから継承するクラスを継承するクラスを作成しようとしています。この基本クラスにはテンプレートがあります。

2つのクラスがこの基本クラスを継承し、さらに2つのクラスがそれぞれ一方または他方のクラスを継承します。作成したボタンをメニューに取り込もうとすると、「クラステンプレートはすでに定義されています」というコンパイルエラーが発生します。ボタンタイプの1つだけを含めるとコンパイルされますが、両方のファイルを含めてコンパイルするとエラーが発生します。

すべてのボタンの基本クラス

#pragma once

#include <SFML/Graphics.hpp>

namespace eng
{
namespace UI
{
    template<class EventTemplate> 
    class ButtonBase
    {

    protected:

        bool hasBeenClicked;

        typename EventTemplate myEvent;

        sf::Sprite mySprite;

    public:

        ButtonBase();

        virtual bool CheckIfUsed(int mouseX, int mouseY, bool mouseClicked, bool mouseReleased) = 0;

        EventTemplate GetButtonEvent();

        sf::Sprite *GetSprite();

    };
};
};

ラジオボタンの基本クラス

#pragma once

#include "Button Base.h"

namespace eng
{
namespace UI
{
    template<class EventTemplate>
    class RadioButton : public ButtonBase<EventTemplate>
    {

    protected:

        enum ButtonState {MouseOutside, MouseOver, On, Off} myState;

    public:

        RadioButton();

        virtual bool CheckIfUsed(int mouseX, int mouseY, bool mouseClicked, bool mouseReleased) = 0;

        void TurnOff();

    };
};
};    

インスタンスとして使用することを目的とした2つのクラス。

#pragma once

#include "Radio Button.h"

namespace eng
{
namespace UI
{

    template<class EventType>
    class RoundRadioButton : public RadioButton<EventType>
    {

    private:

        sf::Rect myArea; 

    public:

        RoundRadioButton(double setx, double sety, double setRadius, sf::Image &setImage, EventType setEvent);

        bool CheckIfUsed(int mouseX, int mouseY, bool mouseClicked, bool mouseReleased);
    };
};
};


#pragma once

#include "Radio Button.h"

namespace eng
{
namespace UI
{
    template<class EventType>
    class RoundRadioButton : public RadioButton<EventType>
    {

    private:

        double myCenterX;
        double myCenterY;

        double myRadius;

    public:

        RoundRadioButton(double setx, double sety, double setRadius, sf::Image &setImage, EventType setEvent);

        bool CheckIfUsed(int mouseX, int mouseY, bool mouseClicked, bool mouseReleased);
    };
};
};

2つのラジオボタンタイプを含むクラス。

#pragma once

#include <vector>

#include "Round Radio Button.h"
#include "Rectangular Radio Button.h"

namespace eng
{
namespace UI
{
    template<class EventType>
    class RadioButtonMenu
    {

    private:

        RadioButton<EventType> *myCurrentChoice;

        std::vector< RadioButton<EventType>* > myButtons;

    public:

        RadioButtonMenu();
        ~RadioButtonMenu();

        void SetParameters(std::vector< RadioButton<EventType> > *setButtons, RadioButton<EventType> *defaultSelection);

        void CheckMouseAction(double mousex, double mousey, bool mouseClicked, bool mouseReleased);

        EventType GetSelection();
    };
};
};

ラジオボタンインクルードの1つを省略すると、エラーはなくなります。これを検索で調べたところ、#pragmaを1回または#ifndefを使用して解決されましたが、すでに実行しています。テンプレートを実際に使用するのはこれが初めてなので、テンプレートについてもっと読んでいますが、理解するのに苦労しています。この問題を解決するために、または一般的にテンプレートを使用して助けていただければ幸いです。

4

1 に答える 1

1

定義が異なる同じ名前(RadioButtonMenu)の2つのテンプレートを作成すると、単一定義規則(ODR)に違反します。プライベート(実装)部分が異なり、インターフェイスが同じであるように見えるため、異なる名前を付けるか、1つのテンプレートにマージします。

于 2013-03-19T07:02:50.597 に答える