如何将静态映射<string,tnested =“”>作为模板类的成员?

时间:2015-08-12 13:40:15

标签: c++ templates static

以下代码无法编译,并出现以下错误:

  

错误C2923'std :: map':'Foo :: CacheEntry'无效   参数'_Ty'的模板类型参数

为什么Foo :: CacheEntry不是有效的模板类型参数?

#include "stdafx.h"
#include <iostream>
#include <map>
#include <string>

template<int arga>
class Foo {
private:
    class CacheEntry {
    public:
        int x;
    };
    static std::map<std::string, CacheEntry> cache;
};

template<int argb>
std::map<std::string, Foo<argb>::CacheEntry> Foo<argb>::cache = std::map<std::string, Foo<argb>::CacheEntry>();

1 个答案:

答案 0 :(得分:1)

Foo<argb>::CacheEntry是一个从属名称,因此您需要告诉编译器它使用typename关键字命名一个类型:

template<int argb>
std::map<std::string, typename Foo<argb>::CacheEntry> Foo<argb>::cache{};

请注意,复制初始化非常冗余,您只需使用值初始化。

如果您发现自己需要相当数量的类型,则可以为其创建别名:

template<int arga>
class Foo {
private:
    class CacheEntry {
    public:
        int x;
    };
    using CacheMap = std::map<std::string, CacheEntry>;
    static CacheMap cache;
};

template<int argb>
typename Foo<argb>::CacheMap Foo<argb>::cache {};