C++ C++;全局算子法

C++ C++;全局算子法,c++,c++11,C++,C++11,我无法理解为什么我无法创建全局运算符()方法,如下所示: #include <iostream> class A { public: bool operator()(const A& a) { return true; } }; bool operator()(int a, int b) { return true; } int main () { std::cout << &q

我无法理解为什么我无法创建全局运算符()方法,如下所示:

#include <iostream>
class A
{
    public:
        bool operator()(const A& a)
       {
           return true;
       }
};

bool operator()(int a, int b)
{
    return true;
}

int main ()
{
std::cout << "Hello\n";
}

如果我将运算符更改为任何like+或-我仍然会得到相同的错误?为什么我们不能定义全局运算符方法?

如果重载(
=()[]->
),标准要求必须是成员函数的运算符很少。呼叫接线员
()
就是其中之一。 编译器生成的错误也说明了这一点


我相信这是因为语义(它意味着与一个对象关联)和“标准如此决定”。为什么要通过使用
::()
全局函数来增加复杂性并干扰它的语义,而您只需将其命名为
Call()

如果重载(
=()[]->
),则该标准需要少数必须是成员函数的运算符。呼叫接线员
()
就是其中之一。 编译器生成的错误也说明了这一点


我相信这是因为语义(它意味着与一个对象关联)和“标准如此决定”。为什么要通过使用
::()
全局函数来增加复杂性,并干扰它的语义,而您只需将其命名为
Call()

您的问题有两个答案

当您编写
operator()(xxx)
时,您试图声明一个函数调用操作符。这意味着您希望能够将某些内容用作函数。为了实现这一点,您必须能够创建这个东西的实例,因此它需要在类中

至于你关于用+或-,替换它的问题,你可以这样做,但在这种情况下不行。C类原语是C++中的一个特例,函数不叫代码>操作符XXX(…)< /C> >不被调用。但是,如果您用类或结构替换其中一个参数,那么将调用一个函数,从而允许您重载它(在这种情况下,我想它比重载更隐蔽)

#包括
#包括
布尔运算符+(标准::字符串a,整数b)
{
返回true;
}
内部主(空)
{
字符串测试;

你的问题有两个答案

编写
operator()(xxx)
时,您试图声明一个函数调用运算符。这意味着您希望能够将某个对象用作函数。要实现这一点,您必须能够创建该对象的实例,因此它必须位于类中

至于你用++或-来代替它,你可以这样做,C类原语是C++中的特例,函数“<代码>操作符xxx(…)< /C>不被调用。但是,如果你用类或结构替换一个参数,那么函数将被调用,允许你重载它。(在这种情况下,我想它更多的是阴影而不是过载)

#包括
#包括
布尔运算符+(标准::字符串a,整数b)
{
返回true;
}
内部主(空)
{
字符串测试;

std::cout你为什么想要一个全局函数调用操作符?它将如何使用?错误说它全部
必须是一个非静态成员函数
,因为标准是这样说的。没有其他答案。而且它无论如何都是毫无意义的。@Someprogrammerdude:
:(3,4)
,我想是吧?
:(3,4)
。这样做有什么用?你为什么想要一个全局函数调用操作符?它将如何使用?错误是说所有的
必须是非静态成员函数,因为标准是这样说的。没有其他答案。而且无论如何,这都是毫无意义的。@Someprogrammerdude:
:(3,4)
,我想是吧?
:(3,4)
。这会有什么作用?可能值得一提的是,您的
操作符+
过载不符合“正常”的要求加法运算符的语义。不鼓励更改常用运算符的语义,因此它们不能以预期的方式工作。值得一提的是,您的
运算符+
重载不符合“正常”要求加法运算符的语义。非常不鼓励更改普通运算符的语义,因此它们不能按预期方式工作。
$ c++ -std=c++14 a.cpp
a.cpp:11:29: error: 'bool operator()(int, int)' must be a nonstatic member function
 bool operator()(int a, int b)
                             ^
#include <string>
#include <iostream>

bool operator+(std::string a, int b)
{
    return true;
}

int main(void)
{
    std::string test;

    std::cout << (test + 10) << std::endl;
    return 0;
}