C++ SFML 编译错误 sf::不可复制::不可复制(const sf::不可复制&) 是私有的
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::NonCopable(const sf::NoneCopyable&)"是专用
SFML-2.3.2\include/SFML/Window/Window.hpp:57:23:错误:在此范围内上下文
SFML-2.3.2\include/SFML/System/NonCopyable.hp:67:5:错误:"sf::NonCopyable::NonCopy able(const sf::NoneCopyable&)"是专用
SFML-2.3.2\include/SFML/Graphics/RenderTarget.hp:51:25:错误:在此上下文
SFML-2.3.2\include/SFML/System/NonCopyable.hp:79:18:错误:'sf::NonCopyable&sf::NonCopyable::operator=(const sf::NoneCopyable&)'是专用
SFML-2.3.2\include/SFML/Window/Window.hpp:57:23:错误:在这种情况下
SFML-2.3.2\include/SFML/System/NonCopyable.hp:79:18:错误:'sf::NonCopyable&sf::NonCopyable::operator=(const sf::NoneCopyable&)'是专用
SFML-2.3.2\include/SFML/Graphics/RenderTarget.hp:51:25:错误:在此上下文中
如何解决这个问题?
您应该阅读SFML教程,并编写类似其示例的程序。
这里的具体问题是sf::RenderWindow
的复制构造函数是私有的——通常复制窗口是没有意义的。
不幸的是,您在std::vector
中使用了SFMLSet
。矢量必须动态地增加其大小,为了实现这一点,它们分配一个新的更大的缓冲区,并将现有内容复制到新的位置——调用SFMLSet
的复制构造函数,后者反过来尝试调用sf::RenderWindow
s。
解决此问题的最佳方法可能是从IMGS中删除sf::RenderWindow
,并将其作为main
中的局部变量,同样,如教程中所述。你可能不是想为每个图像打开一个新窗口,对吧?
该错误消息告诉您正试图将sf::NonCopyable
的实例复制到某个位置。编译器说您正试图调用该类的复制构造函数,但该复制构造函数是私有定义的,因此无法访问。
要修复它,您需要找出是什么导致sc::NonCopyable
实例被复制,并更改代码以使其不存在复制(可能使用指针)。
- 简单可复制与可简单复制
- reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
- 对于参加可复制和可移动类的访问者来说,应该有多少过载?
- 可变参数宏:无法通过"..."传递非平凡可复制类型的对象
- 为什么 std::atomic<std::string> 会给出微不足道的可复制错误?
- 我可以隐式地创建一个琐碎的可复制类型吗
- 是std::memcpy在不同的可复制类型之间的未定义行为
- 为什么一对常量是微不足道的可复制的,而对不是?
- 在一个微不足道的可复制结构中,移动语义应该实现吗?
- 防止作用域枚举可复制/可移动
- C :对象上的可复制视图
- 防御性地应用 std::move 到平凡可复制的类型是否不可取
- 为什么 std::function 本身是可复制构造的类型?
- C++不可复制的 lambda 的行为是可复制的
- 错误:无法通过'...'传递非平凡可复制类型的对象'class boost::filesystem::path'
- 不能让类是微不足道的可复制的。我做错了什么?
- 使用临时存储区复制普通的可复制类型:允许吗
- 使用realloc可以安全地重新分配琐碎的可复制对象的存储吗
- 为什么Boost.Asio处理程序必须是可复制的
- 我需要可复制的缓冲区,尽可能轻(例如,不初始化零)