2014-05-06 60 views
2

嗯,我得到了下面的模板(其中包含一個很大的錯誤):模板instanciation錯誤,MSVC VS GCC

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一樣,我認爲這不是一種標準行爲。

+1

你可以發佈帶參數的實例代碼嗎? –

+0

@Marco Post編輯,但我認爲它會做任何模板相同。 – Holt

回答

1

就我所知,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

編譯器爲模板生成代碼類或函數在實例化類或函數時使用。當它被調用時,成員函數被實例化爲 ,並且當它的類被構造時,虛擬成員函數被實例化。如果您正在爲具有其他用戶的模板構建 庫,可能會導致問題。

類模板是第一家專業再由 編譯器實例化。

因此要麼不需要診斷,要麼根本不生成代碼。

-1

該模板沒有有效的專業化。代碼因此形成,但不需要診斷,因爲沒有嘗試性的專門化代碼。所以這兩個編譯器都符合這一點。

對於引用愛好者,14.6/7在C++ - 在C++ 11兩者98和14.6/8包含:

沒有診斷應的模板定義來針對其發出有效專業化 可以被生成。如果沒有爲模板定義生成有效的專業化,那麼 和該模板未實例化,則模板定義不合格,不需要 診斷。

在這裏有沒有T,這就是它能夠生成代碼MyClass<T>::getAlpha(在standardese,存在該模板沒有有效的專門化),這是一個錯誤(在standardese,代碼是非法的構造)但編譯器不必檢測它(標準,不需要診斷)。

+1

我不明白你稱之爲「一個有效的實例」?是不是MyClass myClass'是一個有效的實例?這些錯誤與參考報價中指出的模板特化有什麼關係? – Holt