gpt4 book ai didi

c++ - VS2013 : passing iterator to a function that takes pointer (migrating VS2010 to VS2013)

转载 作者:行者123 更新时间:2023-11-30 01:17:57 25 4
gpt4 key购买 nike

我有以下代码,当我在 VS2010 中编译它时,编译通过并且一切正常。

AA.h

class AA
{
int i;
public:
AA()
{
i = 0;
}
void setA(AA *a)
{
i = a->geti();
}

int geti()
{
return i;
}
void seti(int i)
{
this->i = i;
}

};

源.cpp:

#include <vector>
#include <iostream>
#include "AA.h"
using namespace std;

int main()
{
AA a1;
AA a2;
AA a3;
a1.seti(1);
a2.seti(2);
a3.seti(3);
vector<AA> aList;

aList.push_back(a1);
aList.push_back(a2);
aList.push_back(a3);

for (vector<AA>::iterator itr = aList.begin();
itr != aList.end(); itr++)
{
AA aa;
aa.setA(itr); // Compiler error on VS2013
cout << aa.geti();
}

return 0;
}

但是在 VS2013 中编译相同的代码会出现以下编译错误:

Source.cpp(52): error C2664: 'void AA::setA(AA *)' : cannot convert argument 1 from 'std::_Vector_iterator>>' to 'AA *' 1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

对此的简单直接修复是显式取消引用迭代器并像这样传递给 set 函数:

for (vector<AA>::iterator itr = aList.begin();
itr != aList.end(); itr++)
{
AA aa;
aa.setA(&*itr); // No error
cout << aa.geti();
}

但这里的问题是我们在数以千计的源文件中有类似的代码,并且在所有文件中进行更改将非常耗时并且实际上是不可能的。

有人能告诉我有没有办法在不更改所有文件的情况下解决这个问题?我们可以在 AA.h 中做些什么来解决这个问题?

最佳答案

一种选择是为当前需要指针的代码使用模板:

template <typename Iterator>
void setA(Iterator a)
{
i = a->geti();
}

唯一的缺点是它会接受任何通过取消引用 -> 调用 geti() 方法返回可以分配给的东西int 有效。但是您可以玩一些技巧SFINAE将其限制为 AA 类。

关于c++ - VS2013 : passing iterator to a function that takes pointer (migrating VS2010 to VS2013),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23361333/

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