在我的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
我真的很喜欢我试图使用的语法。但这可能吗?也许问题是我的操纵器是虚拟的还是非静态的?
答案 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);
这里的区别在于(),这导致执行函数调用而不是尝试传递指向函数的指针(这很可能不是你的意图)。