2011-01-16 4 views
3

Я пытаюсь создать список объектов с использованием варианта boost.C++ Simple Variant Boost

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

К сожалению, получается следующее сообщение об ошибке:

/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 

Я понимаю, что все было бы хорошо, если я использовал форму:

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); 

Но я хотел бы избежать этой формы если это вообще возможно, так как я хотел бы сохранить свои объекты неназванными. Это важно для моей системы - есть ли способ избежать использования названных объектов?

ответ

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 конструкторы (поэтому вы получили ошибку компоновщика) и использовать CSquare(), а не new CSquare() и т. д. Также "Hello World!" имеет тип const char *, поэтому вам необходимо написать string("Hello World!") при передаче его на push_back или он будет неявно преобразован в bool здесь (не то, что вы хотите).

+0

Большое спасибо Stuart :) – Ramsey

+0

@Ramsey: Welcome :) –

1

Вместо List.push_back (новый CSquare()); просто написать

List.push_back(CSquare()); 

А также написать Defination вашего конструктора

0

Вы забудете реализовать конструкторы CRectangle::CRectangle() и CSquare::CSquare().

Либо реализовать их где-то за пределами класса, таких как:

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

... или реализовать их в классе:

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

... или удалить объявления конструктора вообще:

class CRectangle { 
public: 
}; 
Смежные вопросы