模板类中的静态成员

时间:2014-03-23 08:19:21

标签: c++ templates static

我有一个模板化的类和它的静态成员,它是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;
}

2 个答案:

答案 0 :(得分:1)

认为这是你正在尝试做的事情:

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

答案 1 :(得分: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_{};