Visual Studio 2010上的程序编译,但VS 2015上没有

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)

当我尝试编译它时,它会在运算符()返回时显示C3867C2100的错误.但是这些似乎没有任何理由在此刻弹出:_Myfirst是vector类的属性,它应该没问题.

我该如何解决这个问题(真正的文件超过3000行,有600个错误,总是C3867和C2100),我可以在VS 2015和VS 2010之间的某种兼容模式下工作吗?

谢谢.

Mic*_*urr 6

您的代码依赖于类的内部实现细节std::vector,即_Myfirst成员.

std::vector在VS2010和VS2015之间改变的实现,这_Myfirst是VS2010中的一个简单指针,但是是一个成员函数,它返回对VS2015中指针的引用.

您应该编写代码,以便tab1D该类仅使用公共的非内部接口std::vector(您可能已经使用了APP_LINUX块中的代码).

  • 最好采取不使用内部库实现细节的建议.没有片刻的通知,那些东西可以从你身下改变. (2认同)