我不明白这是什么问题:在我的代码中还是在编译器中(不太可能)。有一段这样的代码:
#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;
}
GCC和MSVC都可以对其进行编译。我使用不同版本的GCC和MSVC 17(本地)和19在Godbolt上进行了测试。这是一个链接:https ://godbolt.org/z/Enfm6L 。
但是Clang不会编译它并发出错误:
redefinition of `'TestA<T, std::void_t<typename T::dummy_iterator> >'`
我很感兴趣-也许在标准的某些部分中这段代码是不正确的,或者还有其他地方。
怎么样“的std ::组:: reverse_iterator的”和“的std ::设置:: dummy_iterator”在铛头文件中定义?
—
mvidelgauz
std :: set :: dummy_iterator根本没有在clang头中定义(我希望)。您可以将dummy_iterator更改为所需的任何值,并且不会更改结果,因为问题不在定义中,如下所示。
—
安德烈
谢谢安德烈,我读了答案,确实很有趣
—
mvidelgauz