我知道如何使下面的代码工作:我只是取消注释 Printer 的第二个构造函数。
想法很简单:我想编写一个构造函数/函数,它可以采用存储在一些我可以迭代的抽象数据结构中的多个参数。我希望它至少适用于 vector 和列表(确实如此),但也适用于初始化列表(但它不适用)。
我使用以下简单语法(可能比我想要的更通用,我不使用模板模板)所以我不必编写可变参数模板来处理 std::的分配器类型:
#include <iostream>
#include <vector>
#include <list>
#include <initializer_list>
using namespace std;
struct Printer
{
template<class Container>
Printer(const Container& cont)
{
for(const auto & e : cont)
cout << e << " ";
cout << endl;
}
//template<class T>
//Printer(const initializer_list<T> & l)//why should I ?
//{
// for(const T & e : l)
// cout << e << " ";
// cout << endl;
//}
};
int main()
{
vector<int> v = {1,2,3};
Printer pv(v);
Printer pv2 = v; //ok : not explicit
list<char> l = {'a', 'b', 'c'};
Printer pl(l);
Printer pl2 = l; //ok : not explicit
Printer pi1 = {4,5,6};
Printer pi2 ({4,5,6}); //same as above if explicit
}
但为什么我要明确地为初始化列表编写一个特定的构造函数?错误是“无法将‘{4、5、6}’从‘’转换为‘打印机’”。
基本上,它告诉我们替换不适用于初始值设定项列表。但是为什么?
最佳答案
A brace-enclosed initializer list(正式地,braced-init-list)不是 std::initializer_list .它可以转换为一个,但它不是一个。它也不是容器类型。它根本不是一种类型,实际上,它是由以下符号序列组成的语法结构:
{ initializer-list ,opt }
{ }
因此这种语法将无法完全工作:
Printer pi1 = {4,5,6};
Printer pi2 ({4,5,6}); //same as above if explicit
如果Printer是一个aggregate , 然后它可以执行聚合初始化。
否则,您将无法接受 std::initializer_list。可以根据您提供的大括号括起来的初始化列表构建。
更多信息:
您实际使用该语法执行的操作称为列表初始化(聚合初始化是一种列表初始化)。只是为了进一步混淆,当用于初始化像 T{a, b, c, ...} 这样的类型时它被称为初始化程序列表。这不要与 std::initializer_list 混淆.
当 std::initializer_list是在 C++11 中添加的,它得到了特殊对待。 braced-init-list 现在可用于构建临时 std::initializer_list在构造函数中。这是你看到我们突然能够创建一个 std::vector<int> 的地方就像std::vector<int> vec{1, 2, 3, 4, 5, ...};一样容易
但是,需要注意的一件事是 std::initializer_list构造函数是编译器将选择的“高优先级”构造函数 when you least suspect .
关于c++ - 初始值设定项列表的模板替换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54828916/
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
在我的gem中,我需要yaml并且在我的本地计算机上运行良好。但是在将我的gem推送到rubygems.org之后,当我尝试使用我的gem时,我收到一条错误消息=>"uninitializedconstantPsych::Syck(NameError)"谁能帮我解决这个问题?附言RubyVersion=>ruby1.9.2,GemVersion=>1.6.2,Bundlerversion=>1.0.15 最佳答案 经过几个小时的研究,我发现=>“YAML使用未维护的Syck库,而Psych使用现代的LibYAML”因此,为了解决
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
是否有类似“RVMuse1”或“RVMuselist[0]”之类的内容而不是键入整个版本号。在任何时候,我们都会看到一个可能包含5个或更多ruby的列表,我们可以轻松地键入一个数字而不是X.X.X。这也有助于rvmgemset。 最佳答案 这在RVM2.0中是可能的=>https://docs.google.com/document/d/1xW9GeEpLOWPcddDg_hOPvK4oeLxJmU3Q5FiCNT7nTAc/edit?usp=sharing-知道链接的任何人都可以发表评论
我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c