2014-11-27 6 views
0

내 프로그램에 대해 빠른 질문이 있습니다.이 템플릿 함수를 int이 아닌 Set으로 어떻게 호출 할 수 있습니까? 나는이 여기 C++ 템플릿 클래스로 템플릿 함수를 호출하려면 어떻게해야합니까?

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

설정

라고 여기 클래스 내 CPP의 : 그래서 다른 함수 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의를 추가 할 수 있습니다,하지만 문자 그대로 암시 적 문자열 유형으로 변환 할 수 없기 때문에 다음 a.add(1)는 실패합니다.

addstuff<int>() 작동하지만 그건 즐거운 우연의 일치입니다. add(1)은 해당 인스턴스에서 올바른 유형이 Set<int>에 추가됩니다.

당신 문자열과 정수가 아닌 명시 적으로 생성자가 클래스 Foo를 구축하고 템플릿 유형 것을 만들 수 : addstuff<Foo>(). 하지만 교수님이 그렇게하기를 바라는 것이 아니라고 생각합니다.이 문제를 해결할 수있는 더 나은 방법이 있습니다 (유형 삭제).하지만이 문제는 상당히 복잡해지고 있습니다.

+0

그래, 나는이 벡터에서 문자열과 int를 동시에 던질 수 있다고 생각하지 않는다. –

관련 문제