2013-03-19 94 views
0

我想创建一个继承一个类的类,该类继承自另一个类。在这个基类中是一个模板。类模板已经定义

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

的基类的所有按钮

#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

你的派生类都被命名为'RoundRadioButton'? – Naveen 2013-03-19 05:02:09

+0

LOL OOPS!这实际上是整个问题!它假设是一个圆形按钮和一个矩形按钮。我要删除这个问题。谢谢。 – Azaral 2013-03-19 12:39:16

回答

1

当您使用不同的定义创建两个具有相同名称(RadioButtonMenu)的模板时,您违反了One Definition Rule(ODR)。为他们提供不同的名称或将它们合并到一个模板中,因为它们似乎在私有(实现)部分中不同,并具有相同的接口。

+0

请参阅问题中的评论。我忽略了一个事实,即我本来打算有一个圆形按钮和一个矩形按钮,但实际上已经制作了两个圆形按钮。我的眼睛从来没有抓到过。 – Azaral 2013-03-19 12:40:52