c ++模板部分专业化的成员函数
我是新来的模板,所以也许这是一个微不足道的事情,但我不能得到它的工作。 我试图获得类成员函数的部分专业化。 最短的代码是:
template <typename T, int nValue> class Object{ private: T m_t; Object(); public: Object(T t): m_t(t) {} T Get() { return m_t; } Object& Deform(){ m_t*=nValue; return *this; } }; template <typename T> Object<T,0>& Object<T,0>::Deform(){ this->m_t = -1; return *this; } int main(){ Object<int,7> nObj(1); nObj.Deform(); std::cout<<nObj.Get(); }
我尝试了非成员函数,这很好。 什么也行得通是一个成员函数的完全专业化。
但是,每当我尝试与部分规格。 一个成员函数的我得到的forms的错误:
PartialSpecification_MemberFu.cpp(17): error: template argument list must match the parameter list Object<T,0>& Object<T,0>::Deform().
希望有任何帮助:-)
你不能部分地专门化一个单一的成员函数,你必须部分地专门化整个类。 因此,你需要像这样的东西:
template <typename T> class Object<T, 0> { private: T m_t; Object(); public: Object(T t): m_t(t) {} T Get() { return m_t; } Object& Deform() { std::cout << "Spec\n"; m_t = -1; return *this; } };
14.5.5.3.1。 类模板部分专业化成员的模板参数列表应与类模板部分专业化的模板参数列表相匹配。 类模板部分专业化的成员的模板参数列表应该与类模板部分专业化的模板参数列表匹配。
换句话说,没有部分专业化的成员,没有部分专业化的课程
不幸的是,你不能部分地专注于模板类的成员函数。 您可以部分专门化整个class级或使用inheritance。 您也可以同时使用:
template <typename T, int nValue> class Object { protected: T m_t; public: Object() = delete; Object(T t): m_t(t) {} T Get() { return m_t; } Object& Deform() { m_t *= nValue; return *this; } }; template <typename T> class Object<T,0> : public Object<T,1> { public: using Object<T,1>::Object; Object& Deform() { this->m_t = -1; return *this; } };