1. 程式人生 > >C++ 模板類中的static變數和函式 初始化

C++ 模板類中的static變數和函式 初始化

關鍵詞: 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>();