为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
慕村9548890 2019-11-26 10:01:59
我需要专门针对某种类型的模板成员函数(比方说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 templatesource.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()我该如何解决?这是什么问题?提前致谢。
查看完整描述

2 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

那样行不通。您需要说以下内容,但这是不正确的


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

{

   template<typename T> struct type { };


public:

   template <class T> void get_as() {

     get_as(type<T>());

   }


private:

   template<typename T> void get_as(type<T>) {


   }


   void get_as(type<double>) {


   }

};


查看完整回答
反对 回复 2019-11-26
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

如果可以使用,std::enable_if我们可以依靠SFINAE(替代失败不是错误)


会像这样工作:


#include <iostream>

#include <type_traits>


template <class C> class X

{

public:

    template <class T, typename std::enable_if< ! std::is_same<double,T>::value>::type * = nullptr > void get_as(){

        std::cout << "get as T" << std::endl;

    }



    template <class T, typename std::enable_if< std::is_same<double,T>::value>::type * = nullptr  > void get_as(){

        std::cout << "get as double" << std::endl;

    }

};



int main()

{


    X<int> d;

    d.get_as<double>();


   return 0;

}

丑陋的是,对于所有这些enable_if来说,编译器仅需要一种专门化功能,否则就会产生歧义错误。这就是为什么默认行为“ get as T”也需要启用的原因。


查看完整回答
反对 回复 2019-11-26
  • 2 回答
  • 0 关注
  • 537 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信