[英]C++ SFML Compile errors sf::NonCopyable::NonCopyable(const sf::NonCopyable&) is private
当我尝试编译以下代码时:
SFMLSet.cpp:
#include "SFMLSet.h"
SFMLSet::SFMLSet(string texturePath)
{
if(!texture.loadFromFile(texturePath)) {
exit(1);
}
new (&app) sf::RenderWindow(sf::VideoMode(texture.getSize().x, texture.getSize().y), texturePath, sf::Style::None);
new (&sprite) sf::Sprite(texture);
}
SFMLSet.h:
#ifndef SFMLSET_H
#define SFMLSET_H
#include <SFML/Graphics.hpp>
#include <string>
#include <cmath>
using namespace std;
class SFMLSet {
public:
sf::RenderWindow app;
sf::Texture texture;
sf::Sprite sprite;
sf::Vector2i grabbedOffset;
bool grabbedWindow = false;
SFMLSet (string texturePath);
sf::Event event;
};
#endif // SFMLSET_H
main.cpp:
#include <windows.h>
#include <vector>
#include <iostream>
#include "SFMLSet.h"
int main()
{
bool isRunning=true;
vector<SFMLSet> IMGS;
IMGS.push_back (SFMLSet ("cb.bmp"));
while (isRunning)
{
for (int i=0;i<IMGS.size();i++) {
while (IMGS[i].app.pollEvent(IMGS[i].event))
{
if (IMGS[i].event.type == sf::Event::Closed) {
IMGS[i].app.close();
isRunning=false;
}
if (IMGS[i].event.type == sf::Event::KeyPressed && IMGS[i].event.key.code == sf::Keyboard::Escape)
{
IMGS[i].app.close();
isRunning=false;
}
else if (IMGS[i].event.type == sf::Event::MouseButtonPressed)
{
if (IMGS[i].event.mouseButton.button == sf::Mouse::Left)
{
IMGS[i].grabbedOffset = IMGS[i].app.getPosition() - sf::Mouse::getPosition();
IMGS[i].grabbedWindow = true;
}
}
else if (IMGS[i].event.type == sf::Event::MouseButtonReleased)
{
if (IMGS[i].event.mouseButton.button == sf::Mouse::Left)
IMGS[i].grabbedWindow = false;
}
else if (IMGS[i].event.type == sf::Event::MouseMoved)
{
if (IMGS[i].grabbedWindow&&(IMGS[i].grabbedOffset.x<-10&&IMGS[i].grabbedOffset.y<-10)&&(IMGS[i].grabbedOffset.x>-(IMGS[i].texture.getSize().x)+10&&IMGS[i].grabbedOffset.y>-(IMGS[i].texture.getSize().y)+10))
IMGS[i].app.setPosition(sf::Mouse::getPosition() + IMGS[i].grabbedOffset);
}
}
IMGS[i].app.clear();
IMGS[i].app.draw(IMGS[i].sprite);
IMGS[i].app.display();
}
}
return EXIT_SUCCESS;
}
我收到一些错误:
SFML-2.3.2 \\ include / SFML / System / NonCopyable.hpp:67:5:错误:'sf :: NonCopyable :: NonCopyable(const sf :: NonCopyable&)'是私有的
SFML-2.3.2 \\ include / SFML / Window / Window.hpp:57:23:错误:在此上下文中
SFML-2.3.2 \\ include / SFML / System / NonCopyable.hpp:67:5:错误:'sf :: NonCopyable :: NonCopyable(const sf :: NonCopyable&)'是私有的
SFML-2.3.2 \\ include / SFML / Graphics / RenderTarget.hpp:51:25:错误:在此上下文中
SFML-2.3.2 \\ include / SFML / System / NonCopyable.hpp:79:18:错误:'sf :: NonCopyable&sf :: NonCopyable :: operator =(const sf :: NonCopyable&)'是私有的
SFML-2.3.2 \\ include / SFML / Window / Window.hpp:57:23:错误:在此上下文中
SFML-2.3.2 \\ include / SFML / System / NonCopyable.hpp:79:18:错误:'sf :: NonCopyable&sf :: NonCopyable :: operator =(const sf :: NonCopyable&)'是私有的
SFML-2.3.2 \\ include / SFML / Graphics / RenderTarget.hpp:51:25:错误:在此上下文中
如何解决这个问题呢?
您应该阅读SFML教程 ,并编写类似其示例的程序。
这里的具体问题是sf::RenderWindow
的复制构造函数是私有的-通常,复制窗口没有任何意义。
不幸的是,您在std::vector
使用了SFMLSet
。 向量必须动态地增大其大小,并且要实现此目的,它们必须分配一个更大的新缓冲区,并将其现有内容复制到新位置-调用SFMLSet
的copy构造SFMLSet
,该函数依次尝试调用sf::RenderWindow
。
解决此问题的最佳方法可能是从IMGS中删除sf::RenderWindow
,并再次将其保留为main
的局部变量,如本教程所述。 您可能不是要为每个图像打开一个新窗口,对吗?
该错误消息告诉您您正在尝试将sf::NonCopyable
实例复制到某个地方。 编译器说您正在尝试调用该类的复制构造函数,但是该复制构造函数是私下定义的,因此无法访问。
要解决该问题,您需要找出导致sc::NonCopyable
实例被复制的原因,然后更改该代码,以使没有副本(可能使用指针)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.