"explicit template argument list not allowed" 使用 g++,但使用 clang++ 编译?

"explicit template argument list not allowed" with g++, but compiles with clang++?

我有如下测试代码。

#include <iostream>
#include <vector>

using namespace std;

template<typename Cont>
class Test
{
    template<typename T, typename = void> static constexpr bool check = false;
    template<typename T>
    static constexpr bool check<T, std::void_t<typename T::iterator>> = true;

public:
    static bool fun()
    {
        return check<Cont>;
    }
};

int main([[maybe_unused]] int argc, [[maybe_unused]] char *argv[])
{
    cout << Test<vector<int>>::fun() << endl;
    cout << Test<int>::fun() << endl;

    return 0;
}

用g++编译,编译器会报错:

test.cpp:12:27: error: explicit template argument list not allowed
   12 |     static constexpr bool check<T, std::void_t<typename T::iterator>> = true;
      |                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

但是clang++编译代码没有任何错误。

错误g++ thorws是什么意思? 如何修改g++和clang++编译的代码?

谢谢!

写个偏特化应该就可以了in any context

它被列为 gcc 错误,但尚未修复:gcc bug

作为解决方法,您可以将专业化置于 class 上下文之外,例如:

template<typename Cont>
class Test 
{
    template<typename T, typename = void> static constexpr bool check = false;

public:
    static bool fun()
    {    
        return check<Cont>;
    }    
};
template<typename Cont>
template<typename T>
constexpr bool Test<Cont>::check<T, std::void_t<typename T::iterator>> = true;

int main([[maybe_unused]] int argc, [[maybe_unused]] char *argv[])
{
    cout << Test<vector<int>>::fun() << endl;
    cout << Test<int>::fun() << endl;

    return 0;
}