c:\libraries and headers\sfml\sfml-1.6-sdk-windows-vc2-6ren">
gpt4 book ai didi

c++ - "class template has already been declared as a non-class template"

转载 作者:太空狗 更新时间:2023-10-29 19:37:10 27 4
gpt4 key购买 nike

嘿,当我在后面的代码中离开 namespace sf{ 声明时,出现了这个奇怪的错误:

1>c:\libraries and headers\sfml\sfml-1.6-sdk-windows-vc2008\sfml-1.6\include\sfml\graphics\body.h(70): error C2989: 'sf::Body' : class template has already been declared as a non-class template
1>c:\libraries and headers\sfml\sfml-1.6-sdk-windows-vc2008\sfml-1.6\include\sfml\graphics\body.h(11): error C3856: 'sf': class is not a class template

代码在过去 3 周内不是模板类时运行良好,具有相同的 sf::Body 类名;我最近刚刚对其进行了更改以使其更加灵活。我不能在命名空间内声明模板类还是什么?

代码如下:

#include <SFML/Graphics.hpp>
#include <vector>
#include <math.h>
#include <cmath>

namespace sf{ //when i take this out and the closing bracket the code runs fine

template<typename drawable>
class Body : public sf::Drawable{

private:
sf::Vector2f MoveVal;
std::vector<drawable> Drawables;

public:
Body(const Vector2f& Position = Vector2f(0, 0), const Vector2f& Scale = Vector2f(1, 1), float Rotation = 0.f, const Color& Col = Color(255, 255, 255, 255)){
SetPosition(Position);
SetScale(Scale);
SetRotation(Rotation);
SetColor(Col);};

// Overide Drawable Functions To Detect any Movement
void SetX(float X){
MoveVal.x += X - GetPosition().x;
Drawable::SetX(X);};

void SetY(float Y){
MoveVal.y += Y - GetPosition().y;
Drawable::SetY(Y);};

// Regular Functions
void AddObject(drawable& Object){
Object.Move(GetX(),GetY());
Drawables.push_back(Object);};

void DestroyObject(unsigned short Index){
Drawables.erase(Drawables.begin()+Index);};

void Clear(){
Drawables.clear();};

drawable& GetObject(unsigned short index)
{return Drawables[index];};

unsigned int GetNumbObjects()
{return Drawables.size();};

void Draw(sf::RenderTarget& target){
for(unsigned short I=0; I<Drawables.size(); I++){
//Body offset
Drawables[I].SetPosition(
Drawables[I].GetPosition().x + MoveVal.x,
Drawables[I].GetPosition().y + MoveVal.y);
} // TODO: add tint based on overall Body Color

target.Draw(*this);

//Reset all the Change Values
MoveVal.x=0;
MoveVal.y=0;
};

void Render(sf::RenderTarget& target) const{
for(int I=0; I< Drawables.size(); I++)
Drawables[I].Draw(target);
};
};// Body Class

} //namespace sf

最佳答案

确定发现问题了:

在先前包含的头文件中:Shape.hpp 我使用以下语法将 Body 声明为友元:

friend class Body;

这显然让编译器假设 Body 不是模板(没有模板指示)正确的语法是:

template <typename drawable>    
friend class Body;

因为现在编译器将 Body 理解为模板类

关于c++ - "class template has already been declared as a non-class template",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6825313/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com