c++ - 模板类中的静态成员

标签 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;
}

最佳答案

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

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_{};

关于c++ - 模板类中的静态成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22588528/

相关文章:

c++ - C 和 C++ 中的静态变量

android - 将 C++ OpenCV 链接到 Android Studio 中的应用程序

c++ - 在编译时将函数指针转换为 std::uintptr_t

c++ - 初始化忽略构造函数模板

c# - 通用静态类 - 在运行时检索对象类型

c - 声明为 "const"的全局初始化变量进入文本段,而声明为 "Static"的变量进入数据段。为什么?

c++ - 为什么函数重载会在 C++ 中产生模棱两可的错误?

c++ - sscanf 拒绝整数读取中的前导零

c++ - Unicode 字符显示为十进制数字而不是符号,我该如何解决这个问题?

c++ - 在不同的命名空间中测试特定的类名(SFINAE?)