【发布时间】:2012-07-21 21:02:56
【问题描述】:
关于模板参数,我想重载模板类的 [] 运算符。像这样:
template<
typename T,
template<typename> class Property,
template<typename> class Key1,
template<typename> class Key2>
class a_map
{
public:
const Property<T>& operator[](const Key1<T>& k) const
{ return _values[k.index()]; }
const Property<T>& operator[](const Key2<T>& k) const
{ return _values[k.index()]; }
protected:
std::vector<Property<T> > _values;
};
我会这样使用这个类:
int main()
{
a_map<float, prop, key_a, key_b> pm;
}
基本上我希望能够访问_values 向量内的元素,而不必担心Key 类型。重要的是他们有一个index() 成员。
但是我得到以下错误
错误 C2535: 'const 属性 &a_map::operator [](const Key1 &) const' : 成员函数已定义或 声明
尽管key_a 和key_b 是两个完全不同的types 类模板。
我错过了什么吗?编译器是否担心在某些情况下 Key1<T> 和 Key2<T> 可能实际上是同一类型?
编辑
这些是main中使用的类模板
template<typename T>
struct prop
{
T weight;
T height;
};
template<typename T>
class key_a
{
public:
int index() { return _i; }
private:
int _i;
};
template<typename T>
class key_b
{
public:
int index() { return 3; } // Always return 3
编辑 我正在使用 MVC++ 2008 编译器。
【问题讨论】:
-
您是否 100% 确信
Key1和Key2是不同的模板?试试std::vector和std::list作为测试,或者类似的东西。 -
key_a和key_b- 类型?根据您的声明key_a和key_b必须是类模板,而不是类型。您将第二个、第三个和第四个模板参数声明为 template-template 参数。因此,您必须指定 templates 作为参数。如果key_a和key_b只是类型,你的代码甚至不应该编译。请提供一个具体示例,说明测试中出现该错误的key_a和key_b。 -
这是编译器错误还是链接器错误?
-
@AndreyT 我的错。 key_a 和 key_b 确实是类模板。我已经更正了。
-
@Code-Guru 我相信这是编译器错误。
标签: c++ templates map operator-overloading