模板类成员函数的显式专业化

我需要专门针对某种类型的模板成员函数(比方说double)。当类X本身不是模板类时,它可以正常工作,但是当我使它成为模板时,GCC开始给出编译时错误。


#include <iostream>

#include <cmath>


template <class C> class X

{

public:

   template <class T> void get_as();

};


template <class C>

void X<C>::get_as<double>()

{


}


int main()

{

   X<int> x;

   x.get_as();

}

这是错误消息


source.cpp:11:27: error: template-id

  'get_as<double>' in declaration of primary template

source.cpp:11:6: error: prototype for

  'void X<C>::get_as()' does not match any in class 'X<C>'

source.cpp:7:35: error: candidate is:

  template<class C> template<class T> void X::get_as()

我该如何解决?这是什么问题?


提前致谢。


慕村9548890
浏览 516回答 2
2回答

守候你守候我

那样行不通。您需要说以下内容,但这是不正确的template <class C> template<>void X<C>::get_as<double>(){}明确专门的成员也需要其周围的类模板也明确专门。因此,您需要说以下内容,这将仅使的成员专用X<int>。template <> template<>void X<int>::get_as<double>(){}如果要使周围的模板不专业,则有多种选择。我更喜欢超载template <class C> class X{&nbsp; &nbsp;template<typename T> struct type { };public:&nbsp; &nbsp;template <class T> void get_as() {&nbsp; &nbsp; &nbsp;get_as(type<T>());&nbsp; &nbsp;}private:&nbsp; &nbsp;template<typename T> void get_as(type<T>) {&nbsp; &nbsp;}&nbsp; &nbsp;void get_as(type<double>) {&nbsp; &nbsp;}};

汪汪一只猫

如果可以使用,std::enable_if我们可以依靠SFINAE(替代失败不是错误)会像这样工作:#include <iostream>#include <type_traits>template <class C> class X{public:&nbsp; &nbsp; template <class T, typename std::enable_if< ! std::is_same<double,T>::value>::type * = nullptr > void get_as(){&nbsp; &nbsp; &nbsp; &nbsp; std::cout << "get as T" << std::endl;&nbsp; &nbsp; }&nbsp; &nbsp; template <class T, typename std::enable_if< std::is_same<double,T>::value>::type * = nullptr&nbsp; > void get_as(){&nbsp; &nbsp; &nbsp; &nbsp; std::cout << "get as double" << std::endl;&nbsp; &nbsp; }};int main(){&nbsp; &nbsp; X<int> d;&nbsp; &nbsp; d.get_as<double>();&nbsp; &nbsp;return 0;}丑陋的是,对于所有这些enable_if来说,编译器仅需要一种专门化功能,否则就会产生歧义错误。这就是为什么默认行为“ get as T”也需要启用的原因。
打开App,查看更多内容
随时随地看视频慕课网APP