草庐IT

c++ - 子类坚持调用模板而不是构造函数

coder 2024-02-19 原文

以下不使用 g++ 4.4.7 编译,在命令行上传递 --std==c++0x:

#include <algorithm>
#include <iostream>

template <typename T>
class A
{
public:
    T v;

    A() { std::cout << "A default constructor\n"; }
    A(const A& i): v(i.v) { std::cout << "A copy constructor\n"; }
    A(A&& i): v(std::move(i.v)) { std::cout << "A move constructor\n"; }
#if 1 // turn this off to fix the version without static_cast
    template <typename V>
    explicit A(const V& i): v(i) {}
#endif
};

class B: public A<int>
{
public:
    B() { std::cout << "B default constructor\n"; }
#if 1 // turn this off to get static_cast that makes it compile
    B(const B& i): A<int>(i) {
        std::cout << "B copy constructor\n"; }
    B(B&& i): A<int>(std::move(i)) {
        std::cout << "B move constructor\n"; }
#else
    B(const B& i): A<int>(static_cast<const A<int> &>(i)) {
        std::cout << "B copy constructor\n"; }
    B(B&& i): A<int>(std::move(static_cast<A<int> &&>(i))) {
        std::cout << "B move constructor\n"; }
#endif
};

B foo() {
    B t;
    return t;
}

int main() {
    B t(foo());
    B t2(std::move(t));
    std::cout << "Result is " << t2.v << std::endl;
    return 0;
}

产生以下错误,复制和移动构造函数似乎调用显式 A 模板而不是 A 的明显复制/移动构造函数:

container.cpp: In constructor ‘A<T>::A(const V&) [with V = B, T = int]’:
container.cpp:26:   instantiated from here
container.cpp:17: error: cannot convert ‘const B’ to ‘int’ in initialization

关闭第一个 #if 1 会删除模板,这会编译并生成预期的调用。关闭第二个 #if 1 也可以让它工作(但是在我们的代码中做同样的事情会很痛苦并且需要大量的仔细编辑)。

目前我通过将模板构造函数更改为此并将 bool 添加到所有用户来解决这个问题,但这很丑陋:

A(const V&i, bool dummy): v(i) {}

问题:

  1. 这是 GCC 中的错误吗?
  2. 如果不是,有人可以解释为什么会这样吗?
  3. 建议的修复方法是什么?我的 static_casts 正确吗?

最佳答案

where it seems the copy and move constructors call the explicit A template rather than the obvious copy/move constructors of A:

调用 A(A const&) 构造函数没有什么明显的地方:你正在调用 A 构造函数,参数类型为 B const&,最好的匹配就是模板(完全匹配)而不是 A(A const&)不是> 完全匹配(它需要隐式向上转换)。

所以这个行为完全符合预期。如果您不希望这样做,请更改模板,以便在使用 A 的子类调用时将其禁用(通过 SFINAE):

template <typename V>
explicit A(const V& i,
           typename std::enable_if<! std::is_base_of<A, V>::value>::type* = nullptr)
    : v(i) {}

(未经测试!)

关于c++ - 子类坚持调用模板而不是构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20458134/

有关c++ - 子类坚持调用模板而不是构造函数的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  4. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  5. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  6. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  7. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  8. Ruby——嵌套类和子类是一回事吗? - 2

    下面例子中的Nested和Child有什么区别?是否只是同一事物的不同语法?classParentclassNested...endendclassChild 最佳答案 不,它们是不同的。嵌套:Computer之外的“Processor”类只能作为Computer::Processor访问。嵌套为内部类(namespace)提供上下文。对于ruby​​解释器Computer和Computer::Processor只是两个独立的类。classComputerclassProcessor#Tocreateanobjectforthisc

  9. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  10. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

随机推荐