【问题标题】:Static member in a template class模板类中的静态成员
【发布时间】:2014-03-23 08:19:21
【问题描述】:

我有一个模板类和它的一个静态成员,它是 map 类型的。 我似乎无法弄清楚如何使用该成员。我尝试了一些不同的变体,但这就是它的开始。
我在函数 size() 的定义中遇到错误:

undefined reference to `A<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::my_map_'    




#include <iostream>
#include <map>
#include <string>

using namespace std;

typedef map<string, int> si_map_t;

template<class T>
class A {
public:
    static map<T, int> my_map_;
    static void add(T key, int value) {
        my_map_.insert(std::pair<T, int>(key, value));
    }
    static size_t size() {
        return my_map_.size();
    }
};

template<>
si_map_t A<string>::my_map_;



int main() {
    A<string>::my_map_;
    size_t count = A<string>::size();
    cout << count << endl;
    return 0;
}

【问题讨论】:

    标签: c++ templates static


    【解决方案1】:

    如果您真的想要使用类模板成员的显式特化,请注意这种表示法

    template <>
    si_map_t A<string>::my_map_;
    

    仅表示专业化的声明。这很奇怪,但这是真的。

    使用以下语法定义成员特化:

    template <>
    si_map_t A<string>::my_map_ = si_map_t();
    

    或以下 C++11 语法:

    template <>
    si_map_t A<string>::my_map_ = {};
    

    或

    template <>
    si_map_t A<string>::my_map_{};
    

    【讨论】:

      【解决方案2】:

      我认为这就是你想要做的:

      template<typename T>
      using si_map_t = std::map<T, int>;
      
      template<class T>
      class A {
      public:
          static si_map_t<T> my_map_;
          static void add(T key, int value) {
              my_map_.insert(std::pair<T, int>(key, value));
          }
          static size_t size() {
              return my_map_.size();
          }
      };
      
      template<typename T>
      si_map_t<T> A<T>::my_map_;
      
      int main()
      {
          size_t count = A<string>::size();
          cout << count << endl;
          return 0;
      }
      

      输出

      0
      

      【讨论】:

      • 谢谢。这确实解决了问题。抱歉这个问题看起来有点做作,我只是想抽象出业务逻辑。
      猜你喜欢
      • 2017-10-20
      • 1970-01-01
      • 2012-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多