pLO*_*eGG 1 c++ stl visual-studio-2010 visual-studio-2015
几年前,我正在使用VS 2010用C++编写软件,当我想编译它时,它会向我显示错误.我确切地知道,如果你使用VS 2010它仍然有效,但我的工作只有2015年.
我创建了一个简单的代码来向您显示错误,它涉及一个模板类tab1D,它从vector中引用并重新定义运算符,如"()".以下是简化的代码:
简单主要:
#include <iostream>
#include "memory_tab.h"
using namespace std;
int main() {
cout << "Hello" << endl;
tab1D<int> t (2);
cout << "Initialization works fine" << endl;
cout << t[1] << endl;
cout << "Bracket operator works fine" << endl;
cout << t(1) << endl; // this line calls parenthesis operator which is overwritten in memory_tab.h. It does not compile.
cout << "Error C3867 & C2100" << endl;
int a;
cin >> a;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
memory_tab.h:
//includes and stuff
template <class T>
class tab1D : public vector<T>
{
public:
// //Constructors
// /*!
// * \brief Default constructor (set nbElem and tailleMem to 0)
// */
tab1D() : vector<T>() {};
tab1D(int _nbElem) : vector<T>(_nbElem) {}; // set all elements to 0
// //Operators
T& operator() (unsigned val);
T& operator() (unsigned val) const;
};
template <class T> T& tab1D<T>::operator() (unsigned val)
{
return *(_Myfirst + val);
}
template <class T> T& tab1D<T>::operator() (unsigned val) const
{
return *(_Myfirst + val);
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译它时,它会在运算符()返回时显示C3867和C2100的错误.但是这些似乎没有任何理由在此刻弹出:_Myfirst是vector类的属性,它应该没问题.
我该如何解决这个问题(真正的文件超过3000行,有600个错误,总是C3867和C2100),我可以在VS 2015和VS 2010之间的某种兼容模式下工作吗?
谢谢.
您的代码依赖于类的内部实现细节std::vector,即_Myfirst成员.
std::vector在VS2010和VS2015之间改变的实现,这_Myfirst是VS2010中的一个简单指针,但是是一个成员函数,它返回对VS2015中指针的引用.
您应该编写代码,以便tab1D该类仅使用公共的非内部接口std::vector(您可能已经使用了APP_LINUX块中的代码).
| 归档时间: |
|
| 查看次数: |
90 次 |
| 最近记录: |