2017-02-06 1 views
0

Я пытаюсь написать класс шаблона, который имеет член переданного типа, который предполагается использовать в методе специализированного класса шаблона. Как это:Как получить доступ к полю элемента класса шаблона в специализированном классе шаблона в C++?

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<float> obj2 = MyTemplateClass<float>(); 
obj2.DoSomething(); 

Специализированный класс шаблон не компилируется, выдает ошибку:

"Use of undeclared identifier m_member ".

Есть ли способ для специализированный шаблонный класс для доступа к исходным членам класса без дублирования кода с новым специализированным типом? Или любой другой способ достичь того, что я пытаюсь сделать здесь?

+0

Специализируясь шаблон класса не то же самое, как переопределение виртуальной функции, вы не» t просто заменить одну часть и «наследовать» остальную часть класса из основного шаблона. Специализация шаблона класса должна быть полным классом, поэтому, если она использует член, называемый 'm_member', он должен иметь член, называемый' m_member'. –

ответ

1

В качестве альтернативы, вы можете специализироваться только один метод, что-то вроде:

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; 
} 

Demo

+0

Отличная благодарность! Я не знал, что можно специализироваться на одном подобном методе, это должно решить мою проблему. –

1

So that I can make calls like:

MyTemplateClass<float> obj2 = MyTemplateClass<float>(); 
obj2.DoSomething(); 

The specialised template class won't compile, gives the error: "Use of undeclared identifier 'm_member'".

Это потому, что специализация шаблона не имеет отношения к шаблону универсального класса. Все, что требуется специализации, должно быть реализовано в специализации. Такие, как:

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

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

     float m_member; 
}; 
+0

Спасибо за ответ. Я уже пробовал явно объявлять тип как float, как вы писали, и я видел, что он работал нормально, я просто подумал, что это будет нецелесообразно, потому что он должен генерировать много дублирующегося кода, если у вас много полей-членов и/или многих типов специализироваться. Подход, предложенный Jarod42 выше, кажется, решает мою проблему. –

+0

@CaioSabino, вы должны использовать подход, который наилучшим образом подходит для ваших нужд. –

Смежные вопросы