Sim*_*ley 32 c++ templates specialization
我是模板新手所以也许这是一件微不足道的事情,但我无法让它发挥作用.我试图获得类成员函数的部分特化.最短的代码是:
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();
}
Run Code Online (Sandbox Code Playgroud)
我试过非成员函数,这很好.什么也工作正常是成员函数的完全专业化.
但是,每当我尝试部分规格时.一个成员函数我得到的形式错误:
PartialSpecification_MemberFu.cpp(17): error: template argument
list must match the parameter list Object<T,0>& Object<T,0>::Deform().
Run Code Online (Sandbox Code Playgroud)
将不胜感激任何帮助:-)
Yuu*_*shi 38
您不能仅部分专门化一个成员函数,您必须部分专门化整个类.因此你需要这样的东西:
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;
}
};
Run Code Online (Sandbox Code Playgroud)
Red*_*III 19
14.5.5.3.1.类模板部分特化的成员的模板参数列表应匹配类模板部分特化的模板参数列表.类模板部分特化的成员的模板参数列表应匹配类模板部分特化的模板参数列表.
换句话说:没有部分专业化的成员,没有部分专业成员.
不幸的是,你不能部分地专门化模板类的成员函数.您可以部分地专门化整个类或使用继承.您也可以同时使用:
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;
}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24563 次 |
| 最近记录: |