gpt4 book ai didi

c++ - boost::phoenix::static_cast_ 编译错误

转载 作者:太空宇宙 更新时间:2023-11-04 13:31:34 25 4
gpt4 key购买 nike

尝试在 boost phoenix lambda 中静态转换参数时遇到编译错误。错误本身太长了,所以我将它们发布到 pastebin here .

我创建了一个最小示例来展示我正在尝试做的事情。如果我将变量 b 变成一个 A 指针并且因此不强制转换,那么一切都会正确编译和运行。有谁知道为什么会这样?

最小示例(使用“clang++ -lboost_thread phoenix_test.cpp”编译):

#include <boost/phoenix.hpp>
#include <iostream>

using namespace boost;
using namespace phoenix;
using namespace arg_names;
using namespace local_names;

class A
{
public:
A(int a)
: mA(a)
{};
int GetX() const {return mA;};
protected:
int mA;
};

class B : public A
{
public:
B(int a)
: A(a)
{};
int GetX() const { return mA + 1; }
};

int main (void)
{
const A* a = new A(3);
const A* b = new B(2);
BOOST_AUTO(test, (_1->*&A::GetX)() + (static_cast_<const B*>(_2)->*&B::GetX)());

std::cout << test(a, b) << std::endl;
delete a;
delete b;
return 0;
}

使用的编译器是clang 3.4,也试过gcc 4.6.3。

最佳答案

错误消息似乎暗示您在那里使用了 dynamic_cast_

动态转换需要虚拟类。向基类添加虚拟成员(例如析构函数)

示例:

Live On Coliru

#include <boost/phoenix.hpp>
#include <iostream>

namespace px = boost::phoenix;
using namespace px::arg_names;
using namespace px::local_names;

class A {
public:
virtual ~A() {}
A(int a) : mA(a){};
int GetX() const { return mA; };

protected:
int mA;
};

class B : public A {
public:
B(int a) : A(a){};
int GetX() const { return mA + 1; }
};

int main()
{
const A* a = new A(3);
const A* b = new B(2);
BOOST_AUTO(test, (_1->*&A::GetX)() + (px::dynamic_cast_<const B*>(_2)->*&B::GetX)());

std::cout << test(a, b) << std::endl;
delete a;
delete b;
return 0;
}

打印

6

关于c++ - boost::phoenix::static_cast_ 编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31265160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com