Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何访问C+;中专门模板类中的模板类成员字段+;?_C++_Templates_Template Specialization - Fatal编程技术网

C++ 如何访问C+;中专门模板类中的模板类成员字段+;?

C++ 如何访问C+;中专门模板类中的模板类成员字段+;?,c++,templates,template-specialization,C++,Templates,Template Specialization,我正在尝试编写一个模板类,该类有一个传递类型的成员,该成员应该用于专门模板类的方法。像这样: template <class T> class MyTemplateClass { public: MyTemplateClass() {} void DoSomething() { DoSomethingWithMember(); } void DoSomethingWithMember() {} protected:

我正在尝试编写一个模板类,该类有一个传递类型的成员,该成员应该用于专门模板类的方法。像这样:

template <class T>
class MyTemplateClass
{
public:
    MyTemplateClass() {}

    void DoSomething()
    {
        DoSomethingWithMember();
    }

    void DoSomethingWithMember() {}

protected:
    T m_member;

};

template<>
class MyTemplateClass<float>
{
public:
    void DoSomethingWithMember()
    {
        printf("Member is %f", m_member);
    }
};
模板
类MyTemplateClass
{
公众:
MyTemplateClass(){}
无效剂量测定法()
{
DoSomethingWithMember();
}
void DoSomethingWithMember(){}
受保护的:
清华大学成员;
};
模板
类MyTemplateClass
{
公众:
void DoSomethingWithMember()
{
printf(“成员为%f”,m_成员);
}
};
这样我就可以打这样的电话:

MyTemplateClass<float> obj2 = MyTemplateClass<float>();
obj2.DoSomething();
MyTemplateClass<float> obj2 = MyTemplateClass<float>();
obj2.DoSomething();
MyTemplateClass obj2=MyTemplateClass();
obj2.DoSomething();
专用模板类无法编译,出现错误:

“使用未声明的标识符
m_成员

有没有一种方法可以让专门模板类访问原始类成员,而不必使用新的专门类型复制代码?或者其他方法来实现我在这里的目标

这样我就可以打这样的电话:

MyTemplateClass<float> obj2 = MyTemplateClass<float>();
obj2.DoSomething();
MyTemplateClass<float> obj2 = MyTemplateClass<float>();
obj2.DoSomething();
MyTemplateClass obj2=MyTemplateClass();
obj2.DoSomething();
专用模板类不会编译,给出错误:“使用未声明的标识符‘m_member’”

这是因为模板专门化与泛型类模板没有关系。专业化需要的任何东西都必须在专业化中实现。例如:

template<>
class MyTemplateClass<float>
{
   public:
      void DoSomething()
      {
         DoSomethingWithMember();
      }

      void DoSomethingWithMember()
      {
         printf("Member is %f", m_member);
      }

      float m_member;
};
模板
类MyTemplateClass
{
公众:
无效剂量测定法()
{
DoSomethingWithMember();
}
void DoSomethingWithMember()
{
printf(“成员为%f”,m_成员);
}
浮动货币联盟成员;
};

或者,您可以只指定一种方法,例如:

template <class T>
class MyTemplateClass
{
public:
    MyTemplateClass(T t) : m_member(t) {}

    void DoSomething() { DoSomethingWithMember(); }

    void DoSomethingWithMember();

protected:
    T m_member;

};

// **Fully** Specialize DoSomethingWithMember for float.
template <>
void MyTemplateClass<float>::DoSomethingWithMember()
{
    std::cout << "Member is " << m_member;
}
模板
类MyTemplateClass
{
公众:
MyTemplateClass(T):m_成员(T){}
void DoSomething(){DoSomethingWithMember();}
void DoSomethingWithMember();
受保护的:
清华大学成员;
};
//**完全**专门化DoSomethingWithMember for float。
模板
void MyTemplateClass::DoSomethingWithMember()
{

std::cout专门化一个类模板与重写一个虚拟函数是不同的,您不能仅仅替换一个片段并“继承”主模板中的其他类。类模板专用化必须是一个完整的类,因此,如果它使用名为
m\u member
的成员,则必须有名为
m\u member
的成员。感谢您的回答。我已经尝试过像您编写的那样显式地将类型声明为float,并且我看到它工作得很好,我只是想这并不实用,因为如果你有许多成员字段和/或许多类型需要专门处理,它必然会生成大量重复代码。上面Jarod42建议的方法似乎解决了我的问题。@CaioSabino,你必须使用最适合你需要的方法。非常感谢,伙计!我不知道专门处理一个像这样的单一方法,应该可以解决我的问题。