2012-04-29 2 views
0

Мне нужно создать класс с общим элементом данных, который работает как istream. Для всех типов он должен иметь возможность хранить данные, которые он получает от оператора < <. Я хочу, чтобы он работал для одиночных переменных, если класс не создан для char, где он должен работать для строк C.C++, специализирующийся на функции-члене

template <typename T> 
class foo<C>{ 
    T* data; 
public: 
    void operator << (T t); 
}; 

template <typename T> 
class foo<char>: public foo<T>{ 
public: 
    void operator << (char* str) 
}; 

Это, как я пытался ее решить, но я получаю ERRO говоря: явная специализация с использованием частичной специализации синтаксиса.

ответ

2

Это вы намеревались?

template <typename T> 
class foo 
{ 
    T* data; 
public: 
    void operator<<(T t); 
}; 

template <> 
class foo<char> 
{ 
public: 
    void operator<<(char* str); 
}; 

Если вы имели в виду, чтобы наследовать поведение, вам нужно что-то вроде этого:

template <typename T> 
class foo_impl 
{ 
    T* data; 
public: 
    void operator<<(T t); 
}; 

template <typename T> 
class foo : public foo_impl<T> 
{ 
}; 

template <> 
class foo<char> : public foo_impl<char> 
{ 
public: 
    void operator<<(char* str); 
}; 

(или, еще проще, устраняя ненужные вхождения public)

template <typename T> 
class foo_impl 
{ 
    T* data; 
public: 
    void operator<<(T t); 
}; 

template <typename T> 
struct foo : foo_impl<T> 
{ 
}; 

template <> 
struct foo<char> : foo_impl<char> 
{ 
    void operator<<(char* str); 
}; 

и я будет предлагать некоторую const-correctness:

template <typename T> 
class foo_impl 
{ 
    T* data; 
public: 
    void operator<<(const T& t); 
}; 

template <typename T> 
struct foo : foo_impl<T> 
{ 
}; 

template <> 
struct foo<char> : foo_impl<char> 
{ 
    void operator<<(const char* str); 
}; 
+0

Престижность вам, сэр! Второй кодовый блок - это именно то, что я сделал. – PaulDaPigeon

0

Вы не можете указать тип шаблона в объявлении класса.

template <typename T> 
class foo{ 
    T* data; 
public: 
    void operator << (T t); 
}; 

Попробуйте это. Это также может помочь прочитать документацию cplusplus.com по шаблонам. http://www.cplusplus.com/doc/tutorial/templates/