2011-01-16 4 views
3

변형 부스트를 사용하여 개체 목록을 만들려고합니다.C++ 단순 변형 부스트

#include <string> 
#include <list> 
#include <iostream> 
#include <boost/variant.hpp> 

using namespace std; 
using namespace boost; 

class CSquare; 

class CRectangle { 
public: 
    CRectangle(); 
}; 

class CSquare { 
public: 
    CSquare(); 
}; 

int main() 
{ typedef variant<CRectangle,CSquare, bool, int, string> object; 

    list<object> List; 

    List.push_back("Hello World!"); 
    List.push_back(7); 
    List.push_back(true); 
    List.push_back(new CSquare()); 
    List.push_back(new CRectangle()); 

    cout << "List Size is: " << List.size() << endl; 

    return 0; 
} 

불행하게도, 다음과 같은 오류가 생성됩니다

CSquare x; 
CRectangle y; 
List.push_back("Hello World!"); 
List.push_back(7); 
List.push_back(true); 
List.push_back(x); 
List.push_back(y); 

하지만 난 그 양식을 피하기 위해 싶습니다

/tmp/ccxKh9lz.o: In function `main': 
testing.C:(.text+0x170): undefined reference to `CSquare::CSquare()' 
testing.C:(.text+0x203): undefined reference to `CRectangle::CRectangle()' 
collect2: ld returned 1 exit status 

나는 내가 양식을 사용하면 모든 것이 잘 될 것이라고 실현 가능하다면 나는 내 물건의 이름을 지키고 싶다. 이것은 내 시스템에 대해 요구 사항입니다. - 명명 된 객체 사용을 피할 수있는 방법이 있습니까?

답변

5

그냥 몇 가지를 변경해야 생성자의 해상력을 작성하고 작동 :

#include <iostream> 
#include <list> 
#include <string> 
#include <boost/variant.hpp> 
using namespace std; 
using namespace boost; 

class CRectangle 
{ 
public: 
CRectangle() {} 
}; 

class CSquare 
{ 
public: 
CSquare() {} 
}; 

int main() 
{ 
typedef variant<CRectangle, CSquare, bool, int, string> object; 
list<object> List; 
List.push_back(string("Hello World!")); 
List.push_back(7); 
List.push_back(true); 
List.push_back(CSquare()); 
List.push_back(CRectangle()); 

cout << "List Size is: " << List.size() << endl; 

return 0; 
} 

을 특히, 당신은 CRectangle 및 CSquare 생성자 (정의하는 데 필요한 그래서 당신은 링커 오류가 발생했습니다) new CSquare() 등이 아닌 CSquare()을 사용하는 것입니다. 또한 "Hello World!"const char * 유형이므로 전달할 때 string("Hello World!")을 써야합니다. push_back 또는 여기에서 암시 적으로 bool으로 변환됩니다 (원하는 내용이 아님).

+0

많은 감사 스튜어트 :) – Ramsey

+0

@Ramsey : 환영합니다 :) –

1

대신 List.push_back (새 CSquare()); 단지

List.push_back(CSquare()); 

쓰기 또한

0

CRectangle::CRectangle()CSquare::CSquare() 생성자를 구현하는 것을 잊지 마십시오.

하나 같은 클래스 이외의 곳을 구현합니다

CRectangle::CRectangle() 
{ 
    // ::: 
}; 

... 또는 클래스 내에서이를 구현 :

class CRectangle { 
public: 
    CRectangle() 
    { 
    // ::: 
    } 
}; 

... 또는 전부 생성자 선언을 제거 :

class CRectangle { 
public: 
};