编译模板时的clang错误

clang error while compiling template

本文关键字:clang 错误 编译      更新时间:2023-10-16

我正在尝试触摸C 17功能,并且我选择了Clang。这是我的代码的简化示例,无法通过clang编译:

#include <iostream>
#include <limits>
template<
    typename T,
    template<typename T_> typename Final>
class Base
{
public:
    decltype(auto) Foo() const noexcept
    {
        using TFinal = Final<T>;
        auto& _this = static_cast<const TFinal&>(*this);
        return _this.Bar<true>();
    }
};
template<typename T>
class Derived :
    public Base<T, ::Derived>
{
public:
    template<bool min>
    T Bar() const noexcept
    {
        return min ?
            std::numeric_limits<T>::lowest() :
            std::numeric_limits<T>::max();
    }
};
int main()
{
    Derived<int> instance;
    auto result = instance.Foo();
    std::cout << result << std::endl;
    return 0;
}

它在这里失败:

return _this.Bar<true>();

和错误消息是:

main.cpp:14:32: error: expected expression
        return _this.Bar<true>();
                               ^
main.cpp:35:10: error: variable has incomplete type 'void'
    auto result = instance.Foo();
         ^    

这是我的编译方式:

clang++-5.0 main.cpp -std=c++17

一些其他信息。带有最新语言版本的Visual Studio 17可以食用。当栏功能不是模板时,一切都可以...

有什么建议这里有什么问题?

应该是

return _this.template Bar<true>();

在您的情况下,_this具有相关类型。要参考其成员模板,您必须明确使用关键字template

我必须在何处以及为什么要放置"模板"answers" typename"关键字?

相关文章: