3

为什么我可以专门化 class A,但不能sum以同样的方式专门化功能?如何使此代码工作?提前致谢。

template<class T>
class A
{
};

template<class T>
class A<T*>
{
};

template<class T>
T sum(const T& a, const T& b)
{
    return a + b;
}

template<class T>
T sum<T*> (const T* a, const T* b)
{
    return *a + *b;
}

int _tmain(int argc, _TCHAR* argv[])
{
    int a = 1, b = 2;
    cout << sum<int>(&a, &b);`
    A<int> c;
    A<int*> d;
    return 0;
}
4

3 回答 3

3

您不能部分专门化功能模板,标准禁止这样做。但是你可以简单地重载它:

template<class T>
T sum(const T& a, const T& b);

template<class T>
T sum (const T* a, const T* b); // note the absence of <T*> here
于 2013-07-13T09:36:06.907 回答
2

如前所述,函数模板不能部分特化。

尽管在您确实需要部分专业化(而不是重载)的情况下,有几种解决方法。我只是想补充一点,在这种情况下,您通常可以通过将调用委托给类模板来实现部分专门化的行为

template<typename T> struct sum_impl {
  static T sum(const T& a, const T& b) {
    return a + b;
  }
};

template<typename T> struct sum_impl<T*> {
  static T sum(const T* a, const T* b) {
    return *a + *b;
  }
};

template <typename T>
T sum(const T& a, const T& b)
{
  return sum_impl<T>::sum(a, b);
}
于 2013-07-14T16:07:54.523 回答
1

这对我有用:

template<typename T> typename std::enable_if<std::is_pointer<T>::value==false, T>::type sum(const T& a, const T& b)
{
  return a + b;
}

template<typename T> typename std::enable_if<std::is_pointer<T>::value, typename std::remove_pointer<T>::type>::type sum(const T a, const T b)
{
  return *a + *b;
}
于 2013-07-14T14:16:00.223 回答