對於靜態成員初始化,我使用嵌套幫助程序結構,對於非模板類可以正常工作。 但是,如果封閉類由模板參數化,則嵌套的初始化類未實例化,如果輔助對象未在主代碼中訪問。 爲了說明,一個簡化的例子(在我的情況下,我需要初始化一個向量)。C++靜態成員初始化(內部模板樂趣)
#include <string>
#include <iostream>
struct A
{
struct InitHelper
{
InitHelper()
{
A::mA = "Hello, I'm A.";
}
};
static std::string mA;
static InitHelper mInit;
static const std::string& getA(){ return mA; }
};
std::string A::mA;
A::InitHelper A::mInit;
template<class T>
struct B
{
struct InitHelper
{
InitHelper()
{
B<T>::mB = "Hello, I'm B."; // [3]
}
};
static std::string mB;
static InitHelper mInit;
static const std::string& getB() { return mB; }
static InitHelper& getHelper(){ return mInit; }
};
template<class T>
std::string B<T>::mB; //[4]
template<class T>
typename B<T>::InitHelper B<T>::mInit;
int main(int argc, char* argv[])
{
std::cout << "A = " << A::getA() << std::endl;
// std::cout << "B = " << B<int>::getB() << std::endl; // [1]
// B<int>::getHelper(); // [2]
}
隨着克++ 4.4.1:
[1]和[2]表示:
A = Hello, I'm A.
按預期工作
[1]未註釋:
A = Hello, I'm A. B =
我所期望的,該InitHelper初始化的mB
- [1]和[2]未註釋:
A = Hello, I'm A. B = Hello, I'm B.
按預期工作 - [1]評論,[2]未註釋:
段錯誤在靜態初始化階段在[3]
因此我的問題:這是一個編譯器錯誤還是坐在監視器和椅子之間的錯誤? 如果後者是這種情況:是否有一個優雅的解決方案(即沒有顯式調用靜態初始化方法)?
更新I:
這似乎是一個期望的行爲(如在ISO/IEC C++ 2003標準,14.7.1定義):
除非類模板或一個成員成員模板已被顯式實例化或明確專用化,當需要成員定義存在的上下文中引用專用化時,成員的專業化被隱式實例化;特別是靜態數據成員的初始化(以及任何相關的副作用)不會發生,除非靜態數據成員本身以需要靜態數據成員定義存在的方式使用。
Visual Studio 2008中具有相同的行爲(在靜態初始化-segfault) – 2009-11-30 11:08:27
你爲什麼不只是寫的std ::串B :: MB = 「你好,我是B」? –
2009-11-30 11:11:27
好吧,我看到在實際情況下,您需要無損傷媒介,抱歉。 – 2009-11-30 11:12:09