2013-03-19 91 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