C++ 无法在clang Linux中分配非静态成员函数,但我可以在Visual Studio Windows中分配吗?
我有一个非常简单的类,它返回一个字符串:C++ 无法在clang Linux中分配非静态成员函数,但我可以在Visual Studio Windows中分配吗?,c++,C++,我有一个非常简单的类,它返回一个字符串: class Foo { public: const char *GetString() const { return "bar"; } }; 我有一个非常简单的类,它有一个指向GetString的函数指针 template < class classname > struct ClassFunctionPointer { typedef const char * ( classname::*
class Foo
{
public:
const char *GetString() const
{
return "bar";
}
};
我有一个非常简单的类,它有一个指向GetString的函数指针
template < class classname >
struct ClassFunctionPointer
{
typedef const char * ( classname::* StringReturner )( void ) const;
StringReturner stringReturnerFnPtr;
};
这可以归结为使用括号。让我们生成一个最小的测试用例:
struct Foo
{
int bar();
};
int main()
{
&(Foo::bar);
}
您已经表示VisualStudio接受这一点。不应该
仅当使用显式&
且其操作数是不包含在括号中的限定id时,才会形成指向成员的指针。[注:即,表达式&(限定id)
,其中限定id包含在括号中,不会形成“指向成员的指针”类型的表达式。限定id,因为没有从非静态成员函数的限定id隐式转换为类型“指向成员函数的指针”,就像从函数类型的左值转换为类型“指向函数的指针”([conv.func]
).&unqualified id
也不是指向成员的指针,即使在unqualified id的类的范围内。-结束注释]
我不知道这条规则为什么存在
不管怎样,我尝试过的每个GCC版本:
错误:非静态成员函数“int Foo::bar()的使用无效”
这是一种常见的诊断,表示您忘记了&
或()
。某些编译器的某些版本使用了不同的、更容易混淆的措辞(“在没有对象参数的情况下调用非静态成员函数”)
对于VisualStudio来说,对这样的事情过于宽容是很常见的
由于您希望代码可移植且符合标准,请使用更常见的:
&Foo::GetString
也就是说,去掉括号错误是关于对函数的调用:“错误:在没有对象参数的情况下调用非静态成员函数”,但在您的问题中,我没有看到对上述函数的任何调用。你怎么称呼它?您是否在Windows示例中调用了它?@AlgirdasPreidžius这是一种常见的诊断方法,它假定意图是调用函数,但通常意图是生成函数指针(程序员忘记了
&
)。因此,OP没有调用函数的事实并不是真正的重点。@LightnessRaceswithMonica在阅读您的评论后:第一个想法是:但是询问者没有忘记&
!,但是后来我注意到,无论您是否编译为&(Foo::GetString)
和&Foo::GetString
对GCC和clang有影响,但对VC没有影响。。很高兴知道。@AlgirdasPreidžius是的,这是关键组件,这是解决方案@芬格利凯:好局!
struct Foo
{
int bar();
};
int main()
{
&(Foo::bar);
}
&Foo::GetString