我想重载模板类的[]运算符与模板参数有关。像这样:C++ template class overload []运算符
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()
成员。
不过,我得到以下错误
error C2535: 'const Property &a_map::operator [](const Key1 &) const' : member function already defined or declared
即使key_a
和key_b
是两个完全以不同
类型
类模板。
我错过了什么吗?编译器是否担心在某些情况下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'作为测试,或者类似的东西。 – 2012-07-21 21:07:43
'key_a'和'key_b' - 类型?根据你的声明'key_a'和'key_b'必须是类*模板*,而不是类型。您将第二,第三和第四个模板参数声明为* template-template *参数。所以,你必须指定*模板*作为参数。如果'key_a'和'key_b'只是* types *,那么你的代码甚至不应该编译。在你的测试中给出一个具体的例子,说明什么是'key_a'和'key_b',给你这个错误。 – AnT 2012-07-21 21:09:57
这是编译器错误还是链接器错误? – 2012-07-21 21:14:19