C++ VisualStudio和Clang不同的行为模板元编程

C++ VisualStudio和Clang不同的行为模板元编程,c++,visual-studio,templates,namespaces,clang,C++,Visual Studio,Templates,Namespaces,Clang,以下文件在VisualStudio编译器和Clang for MicrosoftCodeGen上都可以编译,但是结果大不相同 在VisualStudio中,它统计参数列表中动态矩阵的数量(这是我的预期行为)。相反,在clang中,它计算动态矩阵的数量,直到遇到第一个静态矩阵。(输出在main.cpp文件中,格式为(VS,Clang)) 我还能够在gcc 7.1和icc 17上复制,这两个版本都遵循相同的clang行为 使用声明删除元命名空间和添加可以解决这个问题,但我不知道为什么 输出铃声/

以下文件在VisualStudio编译器和Clang for MicrosoftCodeGen上都可以编译,但是结果大不相同

在VisualStudio中,它统计参数列表中动态矩阵的数量(这是我的预期行为)。相反,在clang中,它计算动态矩阵的数量,直到遇到第一个静态矩阵。(输出在main.cpp文件中,格式为(VS,Clang))

我还能够在gcc 7.1和icc 17上复制,这两个版本都遵循相同的clang行为

使用声明删除
命名空间和添加
可以解决这个问题,但我不知道为什么

输出铃声/gcc/icc 我打开了一个关于叮当的程序,很快就发现这确实是一个bug,不仅在叮当中,而且在MSVC中。我将在这里无耻地窃取理查德·史密斯的答案:

这是一个MSVC错误,因为它们缺少/不正确的实现 两阶段名称查找

在f的第二个定义中:

template <std::size_t x, typename ... Args>
auto f(const M<x>& , Args && ... args)
{
    return f(args...);
}
模板
自动f(常数M&,参数&…参数)
{
返回f(args…);
}
。。。第三个“f”尚未声明,因此未被 非限定名称查找。一旦递归达到这个重载, 它永远不能“返回”到第三个过载

如果删除了名称空间,则可以通过 依赖于参数的名称查找

我打开了一个关于叮当的程序,很快就发现这确实是一个bug,不仅在叮当中,而且在MSVC中。我将在这里无耻地窃取理查德·史密斯的答案:

这是一个MSVC错误,因为它们缺少/不正确的实现 两阶段名称查找

在f的第二个定义中:

template <std::size_t x, typename ... Args>
auto f(const M<x>& , Args && ... args)
{
    return f(args...);
}
模板
自动f(常数M&,参数&…参数)
{
返回f(args…);
}
。。。第三个“f”尚未声明,因此未被 非限定名称查找。一旦递归达到这个重载, 它永远不能“返回”到第三个过载

如果删除了名称空间,则可以通过 依赖于参数的名称查找


结果如何?你期待什么?请创建一个@Rakete1111以获取更多信息clarity@quetzalcoatl很多事情,但也许只是我。开始时的缩进。名称空间。宏保护。所有的氧气?评论。你不需要所有这些东西。我再次审查了这段代码,现在我完全同意Rakete的观点——你肯定应该对代码进行更多的修改。这将使分析更容易,也将允许您缩小问题的范围。现在的设置相当复杂,尤其是MatrixBase基础模板的两个面。请试着摆脱它,jsut对于诊断为什么
get\u dynamic\u matrices
不起作用的原因同样如此。
get\u dynamic\u matrices
相对简单。您也应该能够在简单的项目上测试它,例如,一个简单的
类MatrixDynamic
类MatrixStatic
应该足以验证此函数在Compiler和Compiler上的工作方式是否相同。也许即使在没有CRTP基类噪声的简单设置上也有区别?结果如何?你期待什么?请创建一个@Rakete1111以获取更多信息clarity@quetzalcoatl很多事情,但也许只是我。开始时的缩进。名称空间。宏保护。所有的氧气?评论。你不需要所有这些东西。我再次审查了这段代码,现在我完全同意Rakete的观点——你肯定应该对代码进行更多的修改。这将使分析更容易,也将允许您缩小问题的范围。现在的设置相当复杂,尤其是MatrixBase基础模板的两个面。请试着摆脱它,jsut对于诊断为什么
get\u dynamic\u matrices
不起作用的原因同样如此。
get\u dynamic\u matrices
相对简单。您也应该能够在简单的项目上测试它,例如,一个简单的
类MatrixDynamic
类MatrixStatic
应该足以验证此函数在Compiler和Compiler上的工作方式是否相同。也许即使在没有CRTP基类噪声的简单设置上也有区别?
0
0
0
0
1
1
3
template <std::size_t x, typename ... Args>
auto f(const M<x>& , Args && ... args)
{
    return f(args...);
}