2014-11-27 7 views
0

У меня есть быстрый вопрос для моей программы: как я могу назвать эту функцию шаблона Set, а не int? У меня есть класс здесь называется SetC++ Как я могу вызвать функцию шаблона с классом шаблона?

#include <iostream> 
#include <vector> 

using namespace std; 

template<typename T> 
class Set 
{ 
public: 
    class Iterator; 
    void add(T v); 
    void remove(T v); 
    Iterator begin(); 
    Iterator end(); 

private: 
    vector<T> data; 
}; 

Вот мой каст:
К сожалению, основной не может быть функцией шаблона, так что я должен был сделать еще одну функцию addstuff, основным звонки

template <class T> 
Set<T> addstuff() 
{ 
    Set<T> a; 
    a.add(1); 
    a.add(2); 
    a.add(3); 
    a.add("a string"); 

    return a; 
} 

void main() 
{ 
    addstuff<Set>(); //<< Error here. If I use addstuff<int>(), it would run but 
        //I can't add string to it. I am required to be able to add 
        //different data types to this vector 
} 
+1

«... требуется для добавления разностных типов данных ...» - попробуйте 'boost :: any' или ограничьте его полиморфным типом с требуемым базовым классом. – Niall

+0

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

+0

'boost :: any' не слишком сложно реализовать. Иначе посмотрите на союз, затем на типы, которые вам нужно поддерживать. – Niall

ответ

4

Ваше письмо addstuff<Set>() был бы попыткой решить файл Set<Set> addstuff(), что бессмысленно.

addstuff<std::string>()бы позволяют добавлять std::string S к вашему набору, но тогда a.add(1) потерпит неудачу, поскольку буквальное не может быть неявно преобразован в тип строки.

addstuff<int>() Работает, но это веселое совпадение. add(1) имеет правильный тип в этом экземпляре, который должен быть добавлен к Set<int>.

Вы могли построить класс Foo, который имеет не-явных конструкторов в строку и целое и сделать, что ваш тип шаблона: addstuff<Foo>(). Но я не уверен, что это твой профессор хочет, чтобы вы это делали, и есть лучшие способы решения этого вопроса (типа стирания для одного, но это довольно активно).

+0

Да, я не думаю, что в этот вектор можно вставлять строки и int одновременно. –

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