“错误C3867:非标准语法;使用'&'在使用虚拟流操纵器时创建指向成员的指针

时间:2016-03-16 22:07:37

标签: c++ c++11 visual-c++

在我的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

我真的很喜欢我试图使用的语法。但这可能吗?也许问题是我的操纵器是虚拟的还是非静态的?

2 个答案:

答案 0 :(得分:3)

使用NVI,让pageNumber返回一个(有状态的)操纵器,在流式传输时调用流上的虚拟函数。

$scope.showPrompt = function(ev, ret, value) {
  var confirm = $mdDialog.prompt()
  .title('Rediger ' + value)
  .textContent('Indtast en ny værdi for: ' + value)
  .placeholder('getValue()')
  .ariaLabel('Ny ' + value)
  .targetEvent(ev)
  .ok('Accepter')
  .cancel('Annuller');
$mdDialog.show(confirm).then(function(result) {
  //setValue(result);
});
};

有了这个,你就endMessage()

答案 1 :(得分:1)

你写过:

IStr * pStr = new MyStr();
pStr->beginMessage() << "Hello Wordl!" << pStr->endMessage;

虽然你应该写一些类似的东西:

IStr * pStr = new MyStr();
pStr->beginMessage() << "Hello Wordl!" << pStr->endMessage(*pStream);

这里的区别在于(),这导致执行函数调用而不是尝试传递指向函数的指针(这很可能不是你的意图)。