Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用std::tr1::bind和std::vector::push_back_C++_Visual Studio 2010_Bind - Fatal编程技术网

C++ 使用std::tr1::bind和std::vector::push_back

C++ 使用std::tr1::bind和std::vector::push_back,c++,visual-studio-2010,bind,C++,Visual Studio 2010,Bind,为什么我的VS2010无法编译此代码: #include <functional> #include <vector> int main() { std::vector<int> vec; std::bind(&std::vector<int>::push_back, std::ref(vec), 1)(); return 0; } #包括 #包括 int main() { std::vec; std::bind(

为什么我的VS2010无法编译此代码:

#include <functional>
#include <vector>
int main()
{
    std::vector<int> vec;
    std::bind(&std::vector<int>::push_back, std::ref(vec), 1)();
    return 0;
}
#包括
#包括
int main()
{
std::vec;
std::bind(&std::vector::push_-back,std::ref(vec),1)();
返回0;
}

它应该是这样的:

std::vector<int> vec;
std::tr1::bind(&std::vector<int>::push_back, std::tr1::ref(vec), _1)(1);
std::向量向量向量机;
std::tr1::bind(&std::vector::push_-back,std::tr1::ref(vec),_-1)(1);

您应该更具体地说明为什么这似乎不适合您

#include <iostream>
#include <tr1/functional>
#include <vector>

int main(int argc, char* argv[]) {
    std::vector<int> vec;
    std::tr1::bind(&std::vector<int>::push_back, std::tr1::ref(vec), 1)();
    std::cout << "vec.size = " << vec.size() << std::endl;
    std::cout << "vec[0] = " << vec[0] << std::endl;
    return 0;
}

$ gcc -o test -lstdc++ test.cpp && ./test
vec.size = 1
vec[0] = 1
#包括
#包括
#包括
int main(int argc,char*argv[]){
std::vec;
std::tr1::bind(&std::vector::push_-back,std::tr1::ref(vec),1)();
std::cout试试这个:

struct push_back {
    void
    operator()(std::vector<int>& vector, int i) const
    {
        vector.push_back(i);
    }
};

// somewhere else:
std::vector<int> vec;
std::tr1::bind(push_back(), std::tr1::ref(vec), 1)();

我相信不能保证成功。

> Pr>,在便携式C++中,你想做的事情是不可能的。<代码>:ST:::vector:PosiSubSuff<代码>保证C++ 11编译器中的过载,至少在LVales上必须有一个重载,并且Routh.U/P>有一个重载。 通常,在获取重载成员函数的地址时,C++11 FDIS中的§13.4/1告诉我们可以控制获取哪个重载的地址:

在某些上下文中,不带参数的重载函数名的使用解析为重载集中特定函数的函数、函数指针或成员函数指针。函数模板名被视为在此类上下文中命名一组重载函数。所选函数是type与上下文中所需的目标类型的函数类型相同。[注意:即,当匹配指向成员函数类型的指针时,忽略函数所属的类。-结束注意]目标可以是

  • 正在初始化的对象或引用
  • 作业的左边
  • 函数的参数
  • 用户定义运算符的参数
  • 函数、运算符函数或转换的返回值
  • 显式类型转换,或
  • 非类型模板参数
重载函数名前面可以有
&
运算符。重载函数名不得在没有参数的情况下在列出的上下文以外的上下文中使用。[注意:忽略重载函数名周围的任何冗余括号集。.-结束注]

问题来自§17.6.5.5/2:

一个实现可以通过将默认值添加到成员函数签名中来声明类内的附加非虚成员函数签名;<强>因此,C++标准库中的类成员函数的地址有一个未指定的类型。>/P> 因此,获取标准库类成员函数的地址是不可移植的,因为这样一个表达式的类型根据定义是不可知的,除非是在逐个实现的基础上

Luc Danton提出的解决方案(特别是使用lambda)也是我的建议:

std::vector<int> vec;
[&](){ vec.push_back(1); }();
std::向量向量向量机;
[&](){vec.push_back(1);}();

请粘贴您收到的错误。即使我们愿意提供帮助,我们也不是通灵者。我看不出这方面有任何错误。我运行了该代码,它工作正常。请确保包含tr1/functional。它不在VS2010中编译,没有头,只是。我做错了什么?VS2010已经提供了c++0x功能。因此,为了使用
std::bind
只是包含
。它只是无法编译。问题似乎出在#包含中。我使用的是VS2010,没有这样的头。@品红色:VS2010只是没有tr1头,它们嵌入到非tr1头中。另外,VS2010在正常的std命名空间中导入所有重要的tr1名称,所以只需包含
和use
std::bind
,没有
tr1
@magenta请修改您的问题是的,如果我们使用C++0x,lambda可能是最好的选择。但实际上我只是好奇为什么VS2010不能编译我的代码。
std::vector<int> vec;
[&](){ vec.push_back(1); }();