“错误 C3867:非标准语法;使用虚拟流操纵器时,使用“&”创建指向成员的指针
"Error C3867: non-standard syntax; use '&' to create a pointer to member" when using virtual stream manipulator
>在Visual Studio 2015的代码中,我有接口:
struct IStr
{
virtual std::ostream& beginMessage() = 0;
virtual std::ostream& endMessage(std::ostream&) = 0;
};
我有一个实现这个接口的类,如下所示:
#include <sstream>
struct MyStr : public IStr
{
std::stringstream m_stream;
std::ostream& beginMessage() override { return m_stream; }
std::ostream& endMessage(std::ostream& ss) override { return std::endl(ss); }
};
但是,我在尝试编译简单代码时遇到错误:
IStr * pStr = new MyStr();
pStr->beginMessage() << "Hello Wordl!" << pStr->endMessage;
附消息:
Error C3867
'IStr::endMessage': non-standard syntax; use '&' to create a pointer to member
我真的很喜欢我尝试使用的语法。但这可能吗?也许问题是我的操纵器是虚拟的,还是非静态的?
使用 NVI,并endMessage()
返回一个(有状态的)操纵器,该操纵器在流式传输时调用流上的虚拟函数。
struct IStr
{
// other stuff
private:
virtual std::ostream& doBeginMessage() = 0;
virtual std::ostream& doEndMessage(std::ostream&) = 0;
struct EndManip{
IStr* istr;
};
friend std::ostream& operator<<(std::ostream& ss, EndManip em){
return em.istr->doEndMessage(ss);
}
public:
EndManip endMessage() { return {this}; }
std::ostream& beginMessage() { return doBeginMessage(); }
};
有了这个,你会做pStr->beginMessage() << "Hello World!" << pStr->endMessage();
.
你写过:
IStr * pStr = new MyStr();
pStr->beginMessage() << "Hello Wordl!" << pStr->endMessage;
虽然你应该写一些类似的东西:
IStr * pStr = new MyStr();
pStr->beginMessage() << "Hello Wordl!" << pStr->endMessage(*pStream);
这里的区别在于 (),这会导致执行函数调用而不是尝试传递指向函数的指针(这很可能不是您的意图)。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 使用CMake创建QML插件
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++使用params创建线程函数会导致转换错误
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- 使用std::list创建循环链表
- 正在使用for循环创建QScatterSerie
- 使用基类指针创建对象时,缺少派生类析构函数
- 使用Bazel C++教程;build不创建/使用共享库
- 找不到如何创建使用指针、字符和 for 函数组合的程序
- 根据用户输入创建使用C 的图形
- 在 CDialog 派生类上创建使用 VS2015 CLR 返回 0,在 VC++ 6 中工作正常
- 如何创建使用重写函数的非成员函数?
- 用于创建使用XML中定义的GUI的C 本机应用程序的库
- 如何创建使用列表初始化的构造函数
- Scala:在JNI方法中创建/使用自定义类型
- 创建使用运算符的 C++ 类
- MFC:如何创建使用透明 PNG 作为后行(而不是窗口镶边)的瘦身对话框
- 创建使用Boost ASIO而不公开它的静态库