小编Vit*_*ali的帖子

unique_ptr&vector,尝试访问已删除的函数,Visual Studio 2013

我正在尝试使用unique_ptr来管理我的记忆,而VS2013似乎在给我带来麻烦,我认为它不应该.

似乎编译器无论出于什么原因试图访问已删除的拷贝构造函数,而它真的应该没有理由这样做.

这是我的一个类看起来像:

class Mesh
{
public:
    Mesh(oglplus::Program* program, const std::vector<Vertex>& vertices, 
                    const std::vector<GLuint>& indices);
    void draw();
private:
    const oglplus::Program* _program;
    std::vector<Vertex> _vertices;
    std::vector<GLuint> _indices;
    oglplus::Buffer _faceBuffer;
    oglplus::Buffer _vertexBuffer;
    oglplus::VertexArray _vao;
};

class Model
{
public:
    Model(std::string filename, oglplus::Program* program);
    void draw();
private:
    const oglplus::Program* _program;
    std::vector<std::unique_ptr<Mesh>> _meshes;
};
Run Code Online (Sandbox Code Playgroud)

问题出在线上

 std::vector<std::unique_ptr<Mesh>> _meshes;
Run Code Online (Sandbox Code Playgroud)

它开始喷出像这样的东西

2>c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0(593): error C2280: 'std::unique_ptr<Model::Mesh,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' : attempting to reference a deleted function
2>          with
2>          [
2>              _Ty=Model::Mesh
2>          ]
2> …
Run Code Online (Sandbox Code Playgroud)

c++ unique-ptr visual-c++ visual-studio-2013 oglplus

21
推荐指数
1
解决办法
2万
查看次数

为什么模板化右值引用接受左值?

我看到类似的用法

#include <iostream>
#include <functional>
using namespace std;

template<typename FN>
void Foo(FN&& Fn)
{
    Fn();
}


void b()
{
    cout << "2." << endl;
}

int main() 
{
    Foo([](){ cout << "1." << endl; });
    Foo(&b);

    auto c = []() { cout << "3." << endl; };

    Foo(c);

    std::function<void(void)> d = c;

    Foo(d);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我相当确定“c”是一个左值,但我可以相信存在一些 lambda 类型推导恶作剧。但我几乎 100% 确定,d 是左值。

如果函数接受右值,但 d 是左值,为什么模板化的东西可以工作?

此外,为什么人们会这样写 Foo 的签名而不是仅仅这样?

template<typename FN>
void Foo(FN Fn)
Run Code Online (Sandbox Code Playgroud)

c++ templates c++11

5
推荐指数
1
解决办法
108
查看次数

C++模板传入一个模板化类,稍后指定模板类型

我想做类似下面的事情

#include <iostream>
#include <functional>
using namespace std;

bool b1, b2;
int i1, i2;

template<typename COMP>
bool my_comp(COMP comp)
{
    return comp<bool>(b1, b2) && comp<int>(i1, i2);
}

int main() 
{
    my_comp(std::equal_to);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

例如,我想将模板化类传递给模板,并在事后指定模板化类模板参数。

我可以这样做吗?

c++ templates

1
推荐指数
1
解决办法
817
查看次数