类模板已经定义

时间:2013-03-19 04:57:26

标签: c++ templates inheritance

我正在尝试创建一个继承一个类的类,该类继承自另一个类。在这个基类中是一个模板。

两个类继承自此基类,然后另外两个类从一个或另一个类继承。当我尝试将我创建的按钮合并到一个菜单中时,我得到了一个'类模板已被定义'编译错误。如果我只包含其中一个按钮类型,它将编译,但如果我编译包含两个文件我得到错误。

所有按钮的基类

#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();

    };
};
};    

这两个类打算用作实例。

#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);
    };
};
};

包含两个单选按钮类型的类。

#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();
    };
};
};

如果我遗漏了其中一个单选按钮,则错误消失。我在搜索中查看了这个,并且使用#pragma once或#ifndef解决了这个问题,但我已经这样做了。我一直在阅读有关模板的内容,因为这是我第一次尝试使用它们,但我很难理解它。任何帮助解决这个问题或一般模板将非常感激。

1 个答案:

答案 0 :(得分:1)

在创建两个具有不同定义的同名模板(RadioButtonMenu)时,您违反了一个定义规则(ODR)。给它们不同的名称或将它们合并到一个模板中,因为它们在私有(实现)部分看起来不同,并且具有相同的接口。