使用Clang 3.0 -std=c++98编译,接受以下代码:
template<int>
struct I
{
typedef int Type;
};
template<class>
struct S
{
static int f(int);
//static int f(int*);
// implicitly instantiates I<sizeof(int)>
typedef I<sizeof(f(0))>::Type Type;
};
S<int>::Type s;
取消注释 'f' 的重载会导致 Clang 报告错误“在依赖类型名称之前缺少 'typename'”。 G++ 4.8 在有或没有重载的情况下报告相同的错误。无论有没有重载,msvc10 都不会给出任何错误。
标准在哪里说明'f'是否依赖并且'typename'是必需的?如果不需要'typename',标准在哪里说明在这种情况下是否应该执行重载决议?
编辑:
澄清一下:我提到重载决策的原因是可能需要执行重载决策以确定常量表达式“sizeof(f(0))”的值。如果(正如我假设的那样)在确定表达式是否依赖于类型时未执行重载决策,则当依赖重载时,常量表达式'sizeof(f(0))'的值无法确定(在解析时) “f”的存在:例如
template<int>
struct I
{
typedef int Type;
};
template<class T>
struct S
{
static T f(int);
typedef typename I<sizeof(f(0))>::Type Type;
};
S<int>::Type t;
使用 Clang 3.0 -std=c++98 编译,不会产生任何错误。这对我来说似乎是正确的,因为标准认为表达式是依赖于类型的,如果它是一个 id 表达式,命名一个用依赖类型声明的对象。
最佳答案
相关名称在 14.6.2 中定义。 gcc 提示 I<sizeof(f(0))>被依赖,让我们想想看。
14.6.2.1 最后一点:
a template-id in which either the template name is a template parameter or any of the template arguments is a dependent type or an expression that is type-dependent or value-dependent
所以 sizeof(f(0))必须依赖于值(value)。 14.6.2.3p2:
Expressions of the following form are value-dependent if the unary-expression is type-dependent ... sizeof unary-expression
所以如果 f(0) 被认为是依赖的,我们就是依赖的。 (小实验表明 gcc 对待成员任何函数依赖和自由函数不依赖。)14.6.2.2:
Except as described below, an expression is type-dependent if any subexpression is type-dependent.
而且我在异常列表中没有看到类型相关的子表达式或任何相关内容。
关于c++ - C++98 标准在哪里指定对静态成员的调用何时依赖于模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16887608/
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs
我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or
我想使用spawn(针对多个并发子进程)在Ruby中执行一个外部进程,并将标准输出或标准错误收集到一个字符串中,其方式类似于使用Python的子进程Popen.communicate()可以完成的操作。我尝试将:out/:err重定向到一个新的StringIO对象,但这会生成一个ArgumentError,并且临时重新定义$stdxxx会混淆子进程的输出。 最佳答案 如果你不喜欢popen,这是我的方法:r,w=IO.pipepid=Process.spawn(command,:out=>w,:err=>[:child,:out])
我正在尝试找到一种方法来规范化字符串以将其作为文件名传递。到目前为止我有这个:my_string.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.gsub(/[^a-z]/,'_')但第一个问题:-字符。我猜这个方法还有更多问题。我不控制名称,名称字符串可以有重音符、空格和特殊字符。我想删除所有这些,用相应的字母('é'=>'e')替换重音符号,并将其余的替换为'_'字符。名字是这样的:“Prélèvements-常规”“健康证”...我希望它们像一个没有空格/特殊字符的文件名:“prelevements_routin
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是: