我遇到了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:
原来我犯了一个错误,并调用了空构造函数(显然它并不存在)。修正了它。