当我今天在Visual Studio 2015中编写界面时,我发现了一些奇怪的行为。在函数标识符之前放置“virtual”关键字通常无关紧要,但如果将其置于指针或引用之后,则会产生抱怨。请参阅以下内容:
class B {};
class A
{
virtual B fun1a(); // OK
B virtual fun1b(); // OK
virtual B& fun2a(); // OK
B& virtual fun2b(); // ERROR, "expected an identifier"
virtual B* fun3a(); // OK
B* virtual fun3b(); // ERROR, "expected an identifier"
virtual std::unique_ptr<B> fun4a(); // OK
std::unique_ptr<B> virtual fun4b(); // OK
};
为什么会这样?
显然我可以通过始终将virtual关键字放在第一位来完全避免错误,但我希望能够通过以下方式编写函数定义:
foo const & // return value and relevant keywords on one line
virtual bar( const baz &a ) const // function identifier, arguments, and relevant keywords on another line
{
/* method implementation */
}
唉,这对于返回引用或指针的函数是不可能的......
此语法是特定于语言错误还是Visual Studio本地化?
答案 0 :(得分:2)
您是否考虑过使用追踪回报类型?它们将允许您实现将返回类型放在自己的行上的目标:
#include <memory>
class B {};
class A
{
virtual auto fun1a()
-> B;
virtual auto fun1a() const
-> B;
virtual auto fun2a()
-> B&;
virtual auto fun2a() const
-> B&;
virtual auto fun2ac()
-> B const&;
virtual auto fun2ac() const
-> B const&;
virtual auto fun3b()
-> B*;
virtual auto fun3b() const
-> B*;
virtual auto fun3bc()
-> B const*;
virtual auto fun3bc() const
-> B const*;
virtual auto fun4a()
-> std::unique_ptr<B>;
virtual auto fun4a() const
-> std::unique_ptr<B>;
};
需要注意的是,如果您使用final
或override
,那么您已将它们放在返回类型之后:
virtual auto fun3bc() const
-> B const*
final;
但请记住,这样的编码约定(将final
或override
放在自己的行上)非常不寻常。仅仅因为C ++允许你使用它,它不一定是个好主意。
答案 1 :(得分:1)
试试这个
baz const // return value and relevant keywords on one line
virtual &foo::bar( arg a, arg b ) const // function identifier, arguments, and relevant keywords on another line
{
/* method implementation */
}