2015-10-08 50 views
3

我有这样的一段代码,与具有基于什么不同实现的函数成员可用:错误重载函数与enable_if

#include <vector> 

template <typename T> 
struct D 
{ 
    struct inner 
     { T first; }; 
}; 

template <> 
struct D<int> 
{ 
    using inner = std::vector<int>; 
}; 

template <typename T> 
class C 
{ 
    using B = D<T>; 
    typename B::inner b; 

    public: 
     typename std::enable_if<std::is_same<decltype(std::declval<B::inner>().first),T>::value,T>::type 
     first() 
      { return b.first; } 

     typename std::enable_if<std::is_same<decltype(std::declval<B::inner>()[0]),T>::value,T>::type 
     first() 
      { return b[0]; } 
}; 

此代码不能编译。 gcc说那<first signature> cannot be overloaded with <second signature>。我不明白为什么这不起作用。

非常感谢。

回答

5

SFINAE对于模板函数的立即上下文起作用。 这里的函数不是模板,它是类。

一个可行的办法是让你的函数模板:

template <typename U = T> 
std::enable_if_t<std::is_same<U, decltype(std::declval<B::inner>().first)>::value, T> 
first() 
{ return b.first; } 
+0

非常感谢你。你知道我怎样才能实现我的目标? – lodo