我有兩個具有靜態成員實例的類的測試用例。第一種使用非模板化樣本,第二種依賴於通用對象類型。未被調用的C++模板靜態成員構造函數
的困境是簡單:靜態成員的構造函數main函數之前被調用(因爲它應該),但只適用於特定對象類型。泛型類型不表現出相同的行爲。事實上,構造函數根本沒有編譯。似乎編譯器決定完全忽略它作爲(不完全合理)優化的手段。
我想知道發生了什麼,並且可以做些什麼來使它以最優雅的方式工作。我認爲明顯的答案是:在代碼中的某處使用該靜態成員。我不希望這樣做,因爲特定類型的案例不使用該靜態成員,除了在其構造函數中執行某些「工作」之外。
的代碼示例:
//////////////////////////////////////////////
// Specific case
//////////////////////////////////////////////
class CPassive
{
public:
CPassive()
{
printf(" passively called ");
}
};
class CActive
{
private:
static CPassive ms_passive;
};
CPassive CActive::ms_passive;
///////////////////////////////////////////////////////////
// GENERIC TYPES
///////////////////////////////////////////////////////////
class CSample
{
public:
CSample()
{
printf("sample ");
}
};
template <typename T>
class CGenericPassive
{
public:
CGenericPassive()
{
T sample;
printf(" generic passive .. ");
}
private:
};
template <typename T>
class CGenericActive
{
private:
static CGenericPassive<T> ms_passive;
};
template<typename T>
CGenericPassive<T> CGenericActive<T>::ms_passive;
int main(int argc, char** argv)
{
CActive activeExample;// instantiates the static member
CGenericActive<CSample> activeExample; // obliterates the static from the class def.
}
我想我不完全理解。對於泛型類型,您希望運行多少個版本的類,以及爲什麼期望這些版本運行而不是無限數量? 例如, 'CGenericPassive CGenericActive :: ms_passive;'和'CGenericPassiveCGenericActive:: ms_passive;' 而你是什麼意思的 「抹殺從類靜態的」? –
m24p
什麼問題?這段代碼是不是在做你的想法?這是什麼代碼輸出?更具體地說,這個代碼是做什麼的,你需要調整你的教育? – Dan
@Dan模板化的靜態成員必須在非模板化函數中明確引用,以便實例化,而常規靜態成員不需要。我得到了一個答案poi.ting了這一點,但它感覺hackish或似乎有一個C++的規則怪癖。 – teodron