【发布时间】:2021-08-30 01:21:50
【问题描述】:
我正在定义一个类的构造函数,该构造函数受限于检查传入迭代器的底层类型与我的类中定义的 node_type 的类型等价性,这需要借助概念或 SFINAE。
但是,尝试了一些与is_same<>, is_same_v<>, enable_if<> 和same_as<> 概念的组合,离线定义总是会在至少一个主要编译器上产生编译时错误。目前低于SN-P在MSVC / G ++上看到没有错误,但克朗抱怨,所有使用最新版本(分别为19.28,11.1,12.0)。谁能澄清这里有什么问题?谢谢。
已编辑:
从 GCC 12 和 Clang 14 开始,此错误仍然存在。
-
使用 C++20 在 Godbolt 上的代码如下,MSVC/g++ ok,clang 错误 https://godbolt.org/z/fdqEYxKh8
-
代码未在下面显示,但在 Godbolt 上使用 C++11 SFINAE、MSVC/clang ok、g++ 错误 https://godbolt.org/z/7nr7a8jY8
#include <stdio.h>
#include <iterator>
#include <array>
#include <concepts>
#include <cstdlib>
template <typename FPType, std::size_t N>
class PointND {
private:
std::array<FPType, N> coords_;
};
template <typename FPType, std::size_t N, typename ElemType>
class Tree {
public:
struct node_type {
PointND<FPType, N> key;
ElemType value;
};
template <std::random_access_iterator RAI>
requires std::same_as<typename std::iterator_traits<RAI>::value_type,
typename Tree<FPType, N, ElemType>::node_type>
Tree(RAI, RAI);
};
template <typename FPType, std::size_t N, typename ElemType>
template <std::random_access_iterator RAI>
requires std::same_as<typename std::iterator_traits<RAI>::value_type,
typename Tree<FPType, N, ElemType>::node_type>
Tree<FPType, N, ElemType>::Tree(RAI begin, RAI end) {
}
错误在此行上:: 45:30:错误:'tree
Tree<FPType, N, ElemType>::Tree(RAI begin, RAI end) {
【问题讨论】:
-
_Tp使您的程序格式不正确。以_开头,然后为编译器保留一个大写字母only(和内置库)。 (你应该解决这个问题,但这不是你的编译器错误的触发器) -
为什么是 C++11 标签?
-
@ ennico因为我尝试了c ++ 11 enable_if
>方式,clang将编译但msvc和g ++不会。 span> -
@Yakk-AdamNevraumont,感谢您的建议,已在实施中修复。
-
@Nkk,我认为这不是使用该标签的理由。
enable_if在 C++20 中仍然存在并且运行良好。我认为您应该删除标记,该标记显示将此标记用于必须编译为 C++11 的代码。是否需要编译为 C++11?如果没有,则删除标签。
标签: c++ c++11 c++20 sfinae c++-concepts