我一直在听C++中的仿函数.有人可以给我一个关于它们是什么的概述以及在什么情况下它们会有用吗?
这是我的示例代码:
#include <iostream>
#include <string>
using namespace std;
class MyClass
{
string figName;
public:
MyClass(const string& s)
{
figName = s;
}
const string& getName() const
{
return figName;
}
};
ostream& operator<<(ostream& ausgabe, const MyClass& f)
{
ausgabe << f.getName();
return ausgabe;
}
int main()
{
MyClass f1("Hello");
cout << f1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我注释掉,#include <string>我没有得到任何编译器错误,我想因为它包含在内#include <iostream>.如果我在Microsoft VS中"右键单击 - >转到定义",它们都指向xstring文件中的同一行:
typedef basic_string<char, char_traits<char>, allocator<char> >
string;
Run Code Online (Sandbox Code Playgroud)
但是当我运行我的程序时,我收到一个异常错误:
OperatorString.exe中的0x77846B6E(ntdll.dll):0xC00000FD:堆栈溢出(参数:0x00000001,0x01202FC4)
知道为什么我在评论时出现运行时错误#include <string> …
当涉及构造函数时,添加关键字会explicit阻止热情的编译器在不是程序员的第一个意图时创建对象.这种机制是否也适用于铸造操作员?
struct Foo
{
operator std::string() const;
};
Run Code Online (Sandbox Code Playgroud)
例如,在这里,我希望能够投入Foo到一个std::string,但我不希望这种投射是隐含的.
我已经定义了一个结构,它有一个构造函数:
struct MyStruct
{
MyStruct(const int value)
: value(value)
{
}
int value;
};
Run Code Online (Sandbox Code Playgroud)
和以下对象:
int main()
{
MyStruct a (true);
MyStruct b {true};
}
Run Code Online (Sandbox Code Playgroud)
但是我没有收到任何编译错误,无论是MVS2015还是Xcode 7.3.1.
bool数据,但一段时间后,代码改变,bool变得int和介绍了几个错误.)我在我的程序中使用boost共享指针,我有一个类,它将参数作为另一个对象的引用.我遇到的问题是make_shared函数要求所有参数都是const引用,如果我的类的构造函数不允许传入const引用参数,我会得到编译错误.
有谁知道这背后的原因?另外,有什么办法可以解决这个问题吗?
什么给我带来问题的代码示例:
class Object
{
public:
Object(int& i)
{
i = 2;
}
};
int main(int argc, char *argv[])
{
int i = 0;
boost::shared_ptr<Object> obj = boost::make_shared<Object>(i);
return 1;
}
Run Code Online (Sandbox Code Playgroud)
这会导致编译器错误,指出以下内容
:make_shared.hpp:185:错误:没有匹配函数来调用`Object :: Object(const int&)'注意:候选者是:Object :: Object(const Object&)注意:Object :: Object(int&)
如果Objects构造函数的参数是const int,则可以使用.我很好奇为什么make_shared会这样做.
我的班级明确转换为bool:
struct T {
explicit operator bool() const { return true; }
};
Run Code Online (Sandbox Code Playgroud)
我有一个例子:
T t;
Run Code Online (Sandbox Code Playgroud)
要将它分配给类型的变量bool,我需要编写一个强制转换:
bool b = static_cast<bool>(t);
bool b = bool(t);
bool b(t); // converting initialiser
bool b{static_cast<bool>(t)};
Run Code Online (Sandbox Code Playgroud)
我知道我可以在没有强制转换的条件下直接使用我的类型,尽管有explicit限定符:
if (t)
/* statement */;
Run Code Online (Sandbox Code Playgroud)
我还可以t在bool没有演员阵容的情况下使用?
可能重复:
C++中的explicit关键字是什么意思?
是否有理由将explicit关键字用于不带任何参数的函数?它有什么影响吗?我想知道因为我刚刚遇到了这条线
explicit char_separator()
在页面末尾附近记录了boost :: char_separator(http://www.boost.org/doc/libs/1_47_0/libs/tokenizer/char_separator.htm),但在那里没有进一步解释.
我读到,当提供适合转换构造函数或操作数时,C++编译器能够隐式转换类型.我实际上发现了看起来像这样的示例代码:
class Dog{
private:
string name;
public:
Dog(string n):name(n){} //This as the converting constructor
}
int main(){
Dog d = "rover";
}
Run Code Online (Sandbox Code Playgroud)
每当我运行此代码时,编译器都会抛出一条错误消息:
从'const char [6]'转换为非标量类型'Dog'请求Dog d ="rover";
在编译时我添加了编译器选项-std=c++11,所以它不应该是关于C++版本的,对吧?
我在网上找到的例子(至少对我来说)看起来完全相同,所以我不知道这里出了什么问题.
我对此主题的输入来自此视频:
转换构造函数和重载运算符 - 最新的
任何人都知道如何将char数组转换为单个int?
char hello[5];
hello = "12345";
int myNumber = convert_char_to_int(hello);
Printf("My number is: %d", myNumber);
Run Code Online (Sandbox Code Playgroud)