Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法在clang Linux中分配非静态成员函数,但我可以在Visual Studio Windows中分配吗?_C++ - Fatal编程技术网

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