про enable_if и почему не компилируется.
От: collider  
Дата: 18.09.17 19:01
Оценка:
#include <vector>
#include <list>
#include <algorithm>


namespace stdx
{
    template<class T>
    struct _is_std_list: public std::false_type
    {
    };
    
    template<class T, class AllocatorT >
    struct _is_std_list<std::list<T, AllocatorT> > : public std::true_type
    {
    };


    //1 вариант
    template<class ListType,class = std::enable_if_t<_is_std_list<ListType>::value > >
    inline void sort(ListType& _List)
    {
        _List.sort();
    }

    template<class ListType, class  = std::enable_if_t<!_is_std_list<ListType>::value > >
    inline void sort(ListType& _List)
    {
        std::sort(std::begin(_List),std::end(_List));
    }


/*      //2-й вариант
    template<class ListType >
    inline std::enable_if_t<_is_std_list<ListType>::value > sort(ListType& _List)
    {
        _List.sort();
    }

    template<class ListType >
    inline std::enable_if_t<!_is_std_list<ListType>::value > sort(ListType& _List)
    {
        std::sort(std::begin(_List), std::end(_List));
    }
*/

}


int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;

    {
        std::vector<long> test = {1,-1,2,10,3};
        stdx::sort(test); //Error    C2995    'void stdx::sort(ListType &)': function template has already been defined    test    d : \prjvc\test\test\test.cpp    122
    }
    {
        std::list<long> test = { 1,-1,2,10,3 };
        stdx::sort(test); //Error    C2995    'void stdx::sort(ListType &)': function template has already been defined    test    d : \prjvc\test\test\test.cpp    122
    }
    return nRetCode;
}


Почему 1-й вариант в отличие от 2-го не компилируется?
В чем разница?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.