C ++ Simple Variant Boost

时间:2011-01-16 20:32:49

标签: c++ 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 个答案:

答案 0 :(得分: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,否则会在此隐式转换为{{1}}(不是您想要的)。

答案 1 :(得分:1)

而不是List.push_back(new CSquare());写一下

List.push_back(CSquare());

并且还要编写构造函数的定义

答案 2 :(得分:0)

您忘记实施构造函数CRectangle::CRectangle()CSquare::CSquare()

要么在课外的某个地方实施,例如:

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

...或在课堂内实施:

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

...或者完全删除构造函数声明:

class CRectangle {
public:
};