gpt4 book ai didi

c++ - 使用 enable_if 的模板特化在 Clang 中失败,适用于 GCC

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:33:42 24 4
gpt4 key购买 nike

我正在尝试删除基于模板类型的成员函数。问题是在未删除的情况下,使以后的模板特化与我的函数的类型签名匹配。

我尝试了以下代码,它使用 GCC (9.0.1) 编译,但在 Clang (9.0.0) 中出错。我认为它也无法在 MSVC++ 中构建代码。

#include <type_traits>
#include <iostream>

template <typename T>
struct my_type {
template <typename Q = T>
std::enable_if_t<!std::is_same<bool, Q>::value, my_type<T>> my_fun(const my_type<T>& v) {
std::cout << "Base";
return v;
}
};

template <>
template <typename Q>
std::enable_if_t<!std::is_same<bool, double>::value, my_type<double>> my_type<double>::my_fun(const my_type<double>& v) {
std::cout << "Specialized";
return v;
}


int main()
{
my_type<double> aa, bb;
aa.my_fun(bb);
}

Clang 的错误是

prog.cc:16:88: error: out-of-line definition of 'my_fun' does not match any declaration in 'my_type<double>'
std::enable_if_t<!std::is_same<bool, double>::value, my_type<double>> my_type<double>::my_fun(const my_type<double>& v) {
^~~~~~
1 error generated.

我想知道如何使代码工作,以及为什么所有主要编译器的结果都不一致。

最佳答案

在这两种情况下:my_type专用于double .然后比较非专业版的my_fun

template < >
template <typename Q>
std::enable_if_t<!std::is_same_v<bool, Q>::value, my_type<double>>
// ^ (!)
my_type<double>::my_fun(const my_type<double>& v)

针对完全特化的my_fun :

template < >
template < >
// ^
std::enable_if_t<!std::is_same<bool, double>::value, my_type<double>>
my_type<double>::my_fun<double>(const my_type<double>& v)
// ^

以上两种变体都是合法的;相比之下,你最终介于两者之间......

GCC 接受这段代码对我来说不合适,我在评论中加入了“这是一个错误”部分。

也许更糟:考虑 my_type<double>::my_fun<bool>特化——它应该仍然存在,不是吗?

关于c++ - 使用 enable_if 的模板特化在 Clang 中失败,适用于 GCC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54633832/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com