已经用相同类型定义的c++模板成员函数

C++ template member function already defined with same type

本文关键字:c++ 成员 函数 定义 同类型      更新时间:2023-10-16

我有下面这个简单的代码,有2个类型参数的模板。如果我用相同的类型声明我的类(如BidirectionalMap<int,int>),我收到一个错误:

int BidirectionalMap<T,S>::operator [](T) const' : member function already defined or declared  
下面是我的模板代码:
template <class T, class S>
class BidirectionalMap{
    int count(T t){
        return 1;
    }
    int count(S s){
        return 1;
    }
};

您得到的错误是正常的,因为在替换之后您有

template <>
class BidirectionalMap<int, int>
{
    int count(int t){ return 1; }
    int count(int s){ return 1; } // Duplicated method
};

为了解决这个问题,你可以提供部分专门化:

template <class T>
class BidirectionalMap<T, T>
{
    int count(T t) { return 1; }
};

在c++ 20中,您可以使用requires来"丢弃"方法:

template <class T, class S>
class BidirectionalMap
{
    int count(T t) requires(!std::is_same<T, S>::value) { /*..*/ }
    int count(S s) requires(!std::is_same<T, S>::value) { /*..*/ }
    int count(T t) requires( std::is_same<T, S>::value) { /*..*/ }
};