C++ 模板類中的static變數和函式 初始化
阿新 • • 發佈:2019-02-18
關鍵詞: C++ 模板 static 變數 函式 初始化
這篇文章主要介紹關於模板類中如果有static變數如何初始化問題。
重要:如果不初始化static變數,那麼編譯可能沒有問題,但是程式有問題,可能編譯有問題,但是不能確定是初始化問題。
#include"iostream" class C { int ccc; }; class A { public: A() { } A(const std::string &str) { A::stt++; } bool flag; std::string name; public: static int stt; static int &getstt(){return stt;} static std::map<std::string, bool *> m_mapTopic2Data; static bool & flahh(const std::string &str){return *(m_mapTopic2Data[str]);} }; template<class msgtype> class B :public A { public: B(const std::string &str) { A::stt++; bflag = false; m_mapTopic2Data[str] = &flag; } static std::vector<std::string > topic; msgtype a; bool bflag; void print() { std::cout<<"msg"<<a<<std::endl; } public: }; std::map<std::string, bool *> A::m_mapTopic2Data = std::map<std::string, bool *>(); int A::stt=0; int main(int argc, char *argv[]) { B<int> b1("b1"); B<int> b2("b2"); B<int> b3("b3"); B<int> b4("b4"); b2.flag = true; b3.flag = false; // b4.flag = false; // B<int>::flahh("b1") = true; // B<int>::flahh("b2") = false; // B<int>::flahh("b3") = true; // B<int>::flahh("b4") = false; std::cout<<"flag "<< B<int>::flahh("b1") <<" "<<B<int>::flahh("b2") <<" "<<B<int>::flahh("b3") <<" "<<B<int>::flahh("b4")<<" ~"<<std::endl; std::cout<<"A::stt : "<<A::stt<<std::endl; return 1; }
如程式 沒有模板的A類中的靜態變數初始化
std::map<std::string, bool *> A::m_mapTopic2Data = std::map<std::string, bool *>(); int A::stt=0;
有模板的初始化有兩種,一種是需要確定模板到底是啥,一種是不需要確定是啥
不需要確定模板型別為
template <typename T> std::vector<std::string> B<T>::topic = std::vector<std::string>();