MSVS2015更新3错误,模板构造函数无法被构造函数继承识别

时间:2016-08-06 23:05:55

标签: c++ templates inheritance constructor visual-studio-2015

我遇到了MSVS2015 Update 3的错误,我希望得到一些反馈。

我已经在Microsoft connect提交了一个错误报告:https://connect.microsoft.com/VisualStudio/feedback/details/3021085/bug-with-template-constructor-not-being-recognized-with-constructor-inheritance

在撰写本文时,似乎我的附件尚未出现在该网站上,因此我将在此处包含代码以重现此问题。

它出现在以下场景中:

  • 有一个带有构造函数的基本模板,其模板参数作为参数
  • 有一个类继承了特定类型的上述基本模板,它也继承了基本模板的构造函数
  • 另一个模板与基本模板具有相同的参数,它继承了基本模板的构造函数,并包含一个转换运算符,该运算符返回上面类的实例
  • 首先包含派生类,然后包含派生模板
  • 派生类从基础模板继承的构造函数称为

上述情况非常具体,但可能存在一个我无法复制的更普遍的潜在问题。我在我正在处理的项目中遇到了错误,其中包括上述情况。

我没有找到解决问题的方法。

即使IntelliSense显示错误,项目也会编译(因此这是一个错误)。

如果人们可以提供一些关于他们是否能够重现错误以及如何简化重现错误的代码的反馈,那将是很好的。 任何变通办法都是受欢迎的。

重现问题的来源:

Main.cpp

#include "DerivedClass.h"

// If this include is left out, the bug disappears
#include "DerivedTemplate.h"

int main() {
    // The code below falsely reports that no suitable constructor exists to convert
    // from int to DerivedClass, however the code compiles fine
    DerivedClass test = 5;

    return 0;
}

BaseTemplate.h

#pragma once

// The BaseTemplate class must be in a namespace or the bug won't show up
namespace BaseTemplates {
    template <typename Type>
    class BaseTemplate {
    public:
        BaseTemplate() {
        }

        BaseTemplate(const Type& value) {
        }
    };
}

DerivedClass.h

#pragma once

#include "BaseTemplate.h"

class DerivedClass : public BaseTemplates::BaseTemplate<int> {
    using BaseTemplate<int>::BaseTemplate;
};

DerivedTemplate.h

#pragma once

#include "DerivedClass.h"
#include "BaseTemplate.h"

template <typename Type>
class DerivedTemplate : public BaseTemplates::BaseTemplate<Type> {
    // If BaseTemplates:: is left out below, an error will be reported by
    // IntelliSense, even though the code will compile
    using BaseTemplates::BaseTemplate<Type>::BaseTemplate;

public:
    // This operator must be included for the bug to occur
    operator DerivedClass() {
        return DerivedClass();
    }
};

修改

使用Clang for Microsoft Visual Studio 2015编译失败,出现以下构建错误。经过一些更改后,我又将其恢复为一个错误:

Severity    Code    Description Project File    Line    Suppression State
Error       call to implicitly-deleted default constructor of 'DerivedClass'    Bug C:\Users\qub1\Desktop\Bug\Bug\Bug\DerivedTemplate.h 13  

不确定这是Clang或Microsoft编译器的问题。

编辑2:

检查Clang给出的完整错误消息后:

1>------ Build started: Project: Bug, Configuration: Debug Win32 ------
1>  Main.cpp
1>  In file included from Main.cpp:5:
1>./DerivedTemplate.h(13,10): error : call to implicitly-deleted default constructor of 'DerivedClass'
1>                  return DerivedClass();
1>                         ^
1>  ./DerivedClass.h(5,22) :  note: default constructor of 'DerivedClass' is implicitly deleted because base class 'BaseTemplates::BaseTemplate<int>' has no default constructor
1>  class DerivedClass : public BaseTemplates::BaseTemplate<int> {
1>                       ^
1>Main.cpp(13,15): warning : unused variable 'test' [-Wunused-variable]
1>          DerivedClass test = 5;
1>                       ^
1>  1 warning and 1 error generated.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

它报告默认构造函数被隐式删除,因为基类BaseTemplate没有默认构造函数,这是假的,因为它有一个基本构造函数。所以这似乎是Clang中另一个(无关的)错误。

编辑3:

原来我犯了一个错误,并调用了空构造函数(显然它并不存在)。修正了它。

0 个答案:

没有答案