"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;
}
我有如下测试代码。
#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;
}