Простое расширение вариантов C ++ - PullRequest
3 голосов
/ 16 января 2011

Я пытаюсь создать список объектов, используя вариант 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);

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

Ответы [ 3 ]

5 голосов
/ 16 января 2011

Просто нужно изменить несколько вещей, и это работает:

#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 здесь (не то, что вы хотите).

1 голос
/ 16 января 2011

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

List.push_back(CSquare());

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

0 голосов
/ 16 января 2011

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

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

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

... или реализуйте их внутри класса:

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

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

class CRectangle {
public:
}; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...