我正在尝试为一个std :: map实例重载operator [],并对GCC的编译错误感到非常困惑.
以下示例将无法编译:
typedef std::map< int*, int > mymap;
namespace std {
template <>
int & mymap::operator[]( const int* & k) {
return begin()->second;
};
};
Run Code Online (Sandbox Code Playgroud)
这个失败了:
错误:对于'int&std :: map,std :: allocator >> :::运算符[](const int*&)'的模板ID'运算符[] <>'与任何模板声明都不匹配
但如果你int*用myintp(typedef int* myintp)替换它会编译得很好.
有趣的是,为什么这里需要模板<>和命名空间.
更新: 我简化了示例.
只有当声明取决于用户定义的类型且专业化满足原始模板的所有要求时,才允许将任何标准库模板的模板特化添加到命名空间std,除非禁止此类特殊化.
typedef std::map< myclass*, int > mymap;
namespace std {
template <>
int & mymap::operator[]( myclass* const & k) {
return begin()->second;
};
};
Run Code Online (Sandbox Code Playgroud)
这个例子会提供合法且可预测的行为吗?