好吧,我得到了以下模板(其中包含一个大错误):

template <class FluxVar = IloIntVar, class FluxVarArray = IloIntVarArray,
          class DelayVar = IloIntVar, class DelayVarArray = IloIntVarArray,
          class LoadVar = IloIntVar, class LoadVarArray = IloIntVarArray,
          class BoolVar = IloBoolVar, class BoolVarArray = IloBoolVarArray>
class MyClass {
public:
    int getAlpha () { return m_alpha ; }
private:
    int m_alpha1 ; // See the "1" here
}

在我的代码中,我做了类似的事情:
MyClass <> myClass1 ;
MyClass <IloNumVar, IloNumVarArray, IloNumVar, IloNumVarArray, IloNumVar, IloNumVarArray> myClass2 ;
MyClass <IloNumVar, IloNumVarArray, IloNumVar, IloNumVarArray, IloNumVar, IloNumVarArray, IloNumVar, IloNumVarArray> myClass3 ;
/* Some stuff with my class BUT NEVER CALL TO myClassX.getAlpha() */

上面的代码是使用MSVC编译的,而不是使用GCC编译的,(当然)说:
MyClass.h:109:39: error: m_alpha was not declared in this scope

所以我的问题是:标准对此有何表述?这是MSVC的优化吗?如果是,在这种情况下要优化什么?

我认为MSVC不会生成getAlpha的代码,因为它从未被调用过,但是与MSVC一样,我认为它不是一种标准的行为。

最佳答案

据我所知,MSVC并不总是兼容的,并且作为扩展,它允许在类内部对成员函数进行特殊化。

如果未明确告知MSVC,则不会生成代码。如果使用该函数成员,则将触发该错误,也可能会显式地对其进行专门化或实例化:

template <typename T>
class MyClass {
public:
  int getAlpha () { return m_alpha32 ; }
private:
  int m_alpha1 ; // See the "1" here
};

template<> class MyClass<int>{ // Explicit specialization triggers the error
public:
  int getAlpha () { return m_alpha32 ; }
private:
  int m_alpha1 ; // See the "1" here
};

template class MyClass<int>; // Explicit instantiation, triggers the error

int main(){

  MyClass<int> obj; // doesn't trigger the error alone

  obj.getAlpha(); // trigger the error


  return 0;
}

另外在这里看看:http://msdn.microsoft.com/en-us/library/7y5ca42y(v=vs.110).aspx



并且



因此,要么不需要诊断,要么根本不生成代码。

关于c++ - 模板实例化错误,MSVC与GCC,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23492004/

10-12 20:33