gpt4 book ai didi

c++ - 带有 std::enable_if 的 Visual Studio 2015 上的错误 C1001

转载 作者:可可西里 更新时间:2023-11-01 18:37:35 28 4
gpt4 key购买 nike

我有一些 C++11 代码无法在 Visual Studio 2015(更新 2)上编译,但在 Clang 和 GCC 上编译都没有错误。因此,我怀疑 Visual Studio 中存在编译器错误,但也许我的代码格式不正确。

我的真实类 BaseUnitdouble 值的模板包装类,它关注数量的物理量纲(表示为 SI 单位 m、kg、s、 )。例如,速度与时间模板实例的乘积会自动给出距离实例。当前使用标量执行乘法会出现问题。我已尽可能简化类(class)以显示问题。

#include <type_traits>

template<int M>
class BaseUnit
{
public:
constexpr explicit BaseUnit(double aValue) : value(aValue) {}
template<typename U, typename std::enable_if<std::is_arithmetic<U>::value, int>::type = 0>
BaseUnit operator*(U scalar) const { return BaseUnit(value * scalar); }
template<typename U, typename std::enable_if<std::is_arithmetic<U>::value, int>::type = 0>
friend BaseUnit operator* (U scalar, BaseUnit v) { return BaseUnit(scalar*v.value); }
protected:
double value;
};

int main()
{
BaseUnit<1> a(100);
a = 10 * a; // <-- error C1001 here
return 0;
}

在 Visual Studio 上编译时,无论命令行选项如何,都会出现内部错误 C1001:

C:\temp>cl bug.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23918 for x86
Copyright (C) Microsoft Corporation. All rights reserved.

bug.cpp
bug.cpp(19): fatal error C1001: An internal error has occurred in the compiler.
(compiler file 'msc1.cpp', line 1433)
To work around this problem, try simplifying or changing the program near the locations listed above.
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information
Internal Compiler Error in C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\cl.exe. You will be prompted to send an error report to Microsoft later.
INTERNAL COMPILER ERROR in 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\cl.exe'
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information

从一些实验中,碰巧需要两个 operator* 定义才能出现错误。如果删除前缀或后缀版本,示例代码可以正常编译。

如果此行为被确认为错误,并且还不是众所周知的编译器问题,我可能会在 Microsoft 上填写错误报告。

最佳答案

根据当前的C++标准草案:

14.1 Template parameters [temp.param]
1 The syntax for template-parameters is:
template-parameter:
type-parameter
parameter-declaration
type-parameter:
type-parameter-key ...opt identifieropt
type-parameter-key identifieropt= type-id
template < template-parameter-list > type-parameter-key ...opt identifieropt
template < template-parameter-list > type-parameter-key identifieropt= id-expression
type-parameter-key:
class
typename

结果你有语法错误(你可以向 MS 报告编译器没有检测到这样的错误)。因此,在您的情况下,正确的格式正确的代码是:

template<int M>
class BaseUnit
{
public:
constexpr explicit BaseUnit(double aValue) : value(aValue) {}
template<typename U, typename T = typename std::enable_if<std::is_arithmetic<U>::value, int>::type>
BaseUnit<M> operator*(U scalar) const { return BaseUnit<M>(value * scalar); }
template<typename U, typename T = typename std::enable_if<std::is_arithmetic<U>::value, int>::type>
friend BaseUnit operator* (U scalar, BaseUnit v) { return BaseUnit(scalar*v.value); }
protected:
double value;
};

int main()
{
BaseUnit<1> a(100);
a = 10 * a; // ok
a = "19" * a; // error
return 0;
}

关于c++ - 带有 std::enable_if 的 Visual Studio 2015 上的错误 C1001,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38131189/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com