2015-10-28 4 views
-1

Я получил BaseType, который является шаблоном и хочет наследовать его классом ArrayItem. Поскольку я хочу использовать их в качестве шаблона для памяти, я хочу, чтобы класс ArrayItem знал, какой у нас тип. Поэтому я хотел бы специализировать конструктор для некоторых значений шаблона, например long long.шаблон специализации для конструктора родительского класса

template<typename T> 
    class ArrayItem : public BaseType<T> 
    { 
    public: 
     inline ArrayItem(T& t); 
     inline ETypes getType(); 
    private: 
     ETypes m_type; 
    }; 

И HPP должен выглядеть следующим образом:

template <typename T> 
ArrayItem<T>::ArrayItem (T& t): BaseType(t) 
{ 
} 

template <> 
ArrayItem<long long>::ArrayItem(long long& t) : BaseType<long long>(t) // this 
{ 
    m_type = INT; 
} 


template<typename T> 
inline ETypes ArrayItem<T>::getType() 
{ 
    return m_type; 
} 

Но как же я сделать эту специализацию здесь?


enum ETypes 
{ 
    INT, 
    BOOL, 
    OBJECT, 
    ARRAY, 
    DOUBLE, 
    STRING 
}; 

template <typename T> 
class BaseType 
{ 
public: 
    BaseType(); 
    explicit BaseType(T& t); 

protected: 
     union DataUnion 
     { 
      T data; 
      size_t size; //to make it at least 64bit 
     explicit DataUnion(T& t); 
     } m_data; 
}; 

template <typename T> 
BaseType<T>::DataUnion::DataUnion(T& t) 
{ 
    this->data = t; 
} 

template <typename T> 
BaseType<T>::BaseType(T& t) : m_data(t) {} 

template<typename T> 
class ArrayItem : public BaseType<T> 
{ 
public: 
    explicit inline ArrayItem(T& t); 
    inline ETypes getType(); 
private: 
    ETypes m_type; 
}; 

template <typename T> 
ArrayItem<T>::ArrayItem (T& t): BaseType<T>(t) 
{ 
} 

template <> 
ArrayItem<long long>::ArrayItem(long long& t) : BaseType<long long>(t) // this 
{ 
    m_type = INT; 
} 

template<typename T> 
inline ETypes ArrayItem<T>::getType() 
{ 
    return m_type; 
} 

int main() 
{ 
long long somenumber = 1234; 
    ArrayItem<long long> item(somenumber); 
    if(item.getType() == INT) 
    std::cout<< "inttype"; 
//after this we can stancil the ptr to a 
//BaseType<long long> since we know it's a long here 
} 
+0

Что не работает с текущим подходом? – Barry

+0

хорошо, я не могу скомпилировать это, но я хочу специализироваться на классе долгое время, чтобы конструктор установил значение m_type для значения INT. (Его простой перечисление) – BennX

+1

Какова конкретная ошибка компиляции? – Barry

ответ

1

Что вы имеете смотрит прямо на меня, за пределами не предоставляя аргументы шаблона для BaseType для типичного случая.

Вот простая демонстрация:

#include <iostream> 

template <typename T> 
struct B { }; 

template <typename T> 
struct D : B<T> { 
    D(T); 
}; 

template <typename T> 
D<T>::D(T) 
    : B<T>() 
{ 
    std::cout << "def\n"; 
} 

template <> 
D<long>::D(long) 
    : B<long>() 
{ 
    std::cout << "hi\n"; 
} 

int main() 
{ 
    D<int> i(4); // prints def 
    D<long> l(5); // prints hi 
}