C++ 叮当声不响';我不编译代码,但gcc和msvc编译了它
我不明白问题出在哪里:要么在我的代码中,要么在编译器中(不太可能)。有一段代码如下:C++ 叮当声不响';我不编译代码,但gcc和msvc编译了它,c++,templates,gcc,visual-c++,clang,C++,Templates,Gcc,Visual C++,Clang,我不明白问题出在哪里:要么在我的代码中,要么在编译器中(不太可能)。有一段代码如下: #include <iostream> #include <type_traits> #include <set> template<typename T, typename = void> struct TestA: std::false_type {}; template<typename T> struct TestA<T, std:
#include <iostream>
#include <type_traits>
#include <set>
template<typename T, typename = void>
struct TestA: std::false_type {};
template<typename T>
struct TestA<T, std::void_t<typename T::reverse_iterator>> : std::true_type {};
template<typename T>
struct TestA<T, std::void_t<typename T::dummy_iterator>> : std::true_type {};
int main()
{
std::cout << TestA<std::set<int>>::value;
}
#包括
#包括
#包括
模板
struct TestA:std::false_type{};
模板
struct TestA:std::true_type{};
模板
struct TestA:std::true_type{};
int main()
{
std::cout这很可能与疾病有关
别名模板专门化中未使用参数的处理
未由17.6.7[临时别名]的当前措辞指定。对于
例如:
#include <iostream>
template <class T, class...>
using first_of = T;
template <class T>
first_of<void, typename T::type> f(int)
{ std::cout << "1\n"; }
template <class T>
void f(...)
{ std::cout << "2\n"; }
struct X { typedef void type; };
int main() {
f<X>(0);
f<int>(0);
}
对于类模板(别名现在所代表的),定义了替换失败。将其插入示例中可以消除Clang。Clang标头中如何定义“std::set::reverse_iterator”和“std::set::dummy_iterator”?Clang标头中根本没有定义std::set::dummy_iterator(我希望如此)。你可以将dummy_迭代器更改为任何你想要的,它不会更改结果,因为问题不在下面的定义中。谢谢你,Andrei,我读了答案,这很有趣。另一个解决方法是为每个需求创建特征,然后将它们组合在一个启用_if
和std::disconction(或requires子句)感谢您的帮助和参考!很遗憾听到这种叮当声中的错误。有趣的是,我认为您的void\u t实现是标准的。不能采用模板别名的想法。
template <typename...> struct voider { using type = void; };
template <typename... T> using my_void_t = typename voider<T...>::type;