我制作了一个简单的代码来向您显示错误,它涉及一个模板类tab1D,它从向量中删除并重新定义运算符,例如"()"。 以下是简化的代码:
简单主要:
#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;
}
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);
}
当我尝试编译它时,它会在operator()返回时显示错误C3867 et C2100。但是这些似乎没有任何理由在这一刻弹出:_Myfirst是vector类的一个属性,它应该没问题。
如何修复此问题(真实文件超过3000行,600个错误,总是C3867和C2100),我可以在VS 2015和VS 2010之间的某种兼容模式下工作吗?
谢谢。
答案 0 :(得分:6)
您的代码依赖于std::vector
类的内部实现详细信息,即_Myfirst
成员。
在VS2010和VS2015之间std::vector
的实现发生了变化,因此_Myfirst
是VS2010中的一个简单指针,但它是一个成员函数,它返回对VS2015中指针的引用。
您应该编写代码,以便tab1D
类仅使用std::vector
的公共非内部接口(您可能已经使用APP_LINUX
块中的代码)