MSVC 无法根据模板参数进行数学运算,这是一个错误吗?
MSVC fails to do math dependent on template parameters, is this a bug?
如果不太长,我就找不到一个非常合适的标题来回答这个问题,所以这就是为什么它可能不是很准确。我有一个类clamped_value
,它存储一个值并确保该值保持在编译时已知范围内。现在我像这样使用这个类:
class SomeClass
{
using value_type = int;
using percent_type = clamped_value<value_type, 0, 100>;
};
这一切都工作正常,我继续添加一个Precision
模板参数来SomeClass
template<int Precision>
class SomeClass
{
using value_type = int;
using percent_type = clamped_value<value_type, 0, 100 * (Precision + 1)>;
};
突然密码坏了!在已经定义的函数中给出很多关于函数的错误clamped_value.hpp
(我确信那里的标题保护是正确的(。我决定使用 Gcc 测试代码(请参阅此处的 coliru 示例(,它工作得很好。与Clang一起编译也有效。这是 MSVC 中的错误吗?
MSVC 版本是 15.7.2。
更新
我创建了一个小示例来模拟我正在做的事情,问题消失了:
template<class T, int N, int M>
class clamped_value
{
public:
#define GEN_F(f) void f() {}
GEN_F(a)
GEN_F(b)
};
template<int N = 0>
class SomeClass
{
using percent_type = clamped_value<int, 0, 100 * N>;
public:
SomeClass()
{
percent_type p;
p.a();
}
};
int main()
{
SomeClass<> a;
}
额外的结肠链接:https://coliru.stacked-crooked.com/a/a2d612a292e72198
新更新:将VS更新到最新版本未解决问题。现在就做一个更好的MCVE。
经过一番工作,我终于发现了问题所在。首先,我设法在这里复制了gcc上的错误。当开始更多地思考这个问题时,我终于发现了它。在clamped_value
中,有一个宏:
#define GEN_ARITHMETIC_OP(op)
template<typename Ty, Ty TMin, Ty TMax, typename U, U UMin, U UMax>
friend constexpr detail::common_clamped_value_t<Ty, TMin, TMax, U, UMin, UMax>
operator op(clamped_value<Ty, TMin, TMax> const& lhs, clamped_value<U, UMin, UMax> const& rhs)
{
auto val = detail::common_clamped_value_t<Ty, TMin, TMax, U, UMin, UMax>(lhs.m_value op rhs.m_value);
val.clamp();
return val;
}
现在,这里的问题是第一个clamped_value
是模板化的,因此适用于所有clamped_value
。因此,如果我只实例化一个clamped_value
,一切正常。但是从我使用一组新的模板参数的那一刻起,宏就会再次展开,运算符被定义两次。一个简单的解决方法是将宏定义更改为仅适用于当前实例化的类型:
#define GEN_ARITHMETIC_OP(op)
template<typename U, U UMin, U UMax>
friend constexpr detail::common_clamped_value_t<T, Min, Max, U, UMin, UMax>
operator op(clamped_value const& lhs, clamped_value<U, UMin, UMax> const& rhs)
{
auto val = detail::common_clamped_value_t<T, Min, Max, U, UMin, UMax>(lhs.m_value op rhs.m_value);
val.clamp();
return val;
}
相关文章:
- C++,我收到一个无法理解的编译器错误
- VSCode-有一个红色下划线,但程序构建和运行正确,并且出现配音错误
- 删除映射和分割错误中的一个过去结束元素
- 为什么我的 heap.h 文件给我一个LNK2001错误?
- 写一个分数类,我无法弄清楚这些错误
- 我在 .h 中有一个枚举类,并且在.cpp错误中有一个运算符重载:与"运算符<<不匹配
- 一个标头库中的错误
- 给定一个整数数组,需要在Max_Heap上运行操作。得到错误"segmentation fault",有什么想法吗?(C++)
- 使用Visual Studio在虚幻引擎中创建一个新的类c ++给了我太多的错误
- 我正在尝试制作一个自平衡机器人,但编译时存在错误。我不知道如何解决它
- 试图修复一个错误,该错误不会让我开始编程其余部分
- MSVC 无法根据模板参数进行数学运算,这是一个错误吗?
- 我正在尝试一个傻瓜 C++ 练习,我遇到了一个错误,说类 'GraduateStudent' 没有任何名为 'advisor' 的字段
- 零四元数和任何向量都不为零的特征积,这是一个错误吗?
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- 两个线程一个使用流 Api,另一个线程创建文件失败并出现错误ERROR_SHARING_VIOLATION
- 在使用堆栈为下一个最大数字编写代码时面临 SIGSEGV(分段错误)
- LNK2019错误一个DLL链接到MFC DLL
- 错误:一个声明中有多个类型
- 带有两个运算符的C++11模糊错误(一个左值-第二个右值).底部的