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;
}