以下代码无法编译,并出现以下错误:
错误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>();
答案 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 {};