使用模板独立enable_if时,链接器错误带有模板的朋友功能
linker error with templated friend function of templated class when using template independent enable_if
我正在使用模板的朋友函数与模板类打交道
template<typename T>
struct X {
template<typename someX>
auto friend f (someX x) -> std::enable_if_t<std::is_same_v<decltype(x.hidden), int>, int>;
private:
T hidden = 42;
};
template<typename someX>
auto f(someX x) -> std::enable_if_t<std::is_same_v<decltype(x.hidden), int>, int> {return x.hidden;}
这与G 一起编译,但在
中的链接时间失败int main () {
X<int> x;
std::cout << f(x);
}
prog.cc:(.text+0x15): undefined reference to `std::enable_if<is_same_v<decltype ({parm#1}.hidden), int>, int>::type f<X<int> >(X<int>)'
collect2: error: ld returned 1 exit status
请参阅此处。
我观察到的是:
将
enable_if
(类型)的第二个参数替换为依赖类模板的东西(int
→decltype(x.hidden)
),请参见此处的链接与G 。在公开
hidden
并删除朋友声明时,代码链接正常(因此函数模板得到实例化)。删除enable_if并将返回类型声明为
int
工作正常。将enable_if从返回类型移动到
template <typename … , typename = typename enable_if_t<…>>
,但是在这里我无法编译,因为G 和Clang 告诉我朋友声明不允许默认模板参数。从朋友声明中删除enable_if,仅保留在definiton→未能链接
用clang 链接到成功
将函数定义移动到类声明中(在现实世界中失败,因为该函数应该以各种参数作为变异模板,然后我违反了一个定义的
f(X<int>, X<float>)
一次进入X<int>
定义,一次在X<float>
定义中。
这是g (8.2)错误还是clang 违反了标准,在后一种情况下,我如何触发该函数的代码生成?
这是g (8.2)错误还是clang 违反了标准
我怀疑GCC是正确的。模板朋友是语言的黑暗角落。
如何触发该函数的代码生成?
我会通过一个朋友的演员来做。
#include <iostream>
struct friend_of_f
{
template<class someX>
static auto apply(someX x) -> std::enable_if_t<std::is_same_v<decltype(x.hidden), int>, decltype(x.hidden)>
{
return x.hidden;
}
};
template<typename someX>
auto f(someX x) -> decltype(friend_of_f::apply(x))
{
return friend_of_f::apply(x);
}
template<typename T>
struct X
{
friend friend_of_f;
private:
T hidden = 42;
};
int main () {
X<int> x;
std::cout << f(x);
X<double> y;
// std::cout << f(y);
}
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 为什么即使我声明了朋友类,我也会收到错误"无法访问类中声明的私人成员"
- 在课堂上创建了一个朋友,给出"无输入文件"错误
- 朋友功能声明中的错误C
- 朋友功能不起作用(语法错误)
- C 朋友模板功能错误
- 使用模板独立enable_if时,链接器错误带有模板的朋友功能
- 在模板类中专门定义错误的朋友操作员
- C++类和朋友视觉工作室链接错误
- 最Vexing的朋友?朋友化一个专门的免费函数模板会引发编译错误(当重载一个方法时)
- C++错误C2027:使用未定义的类型'第二'(朋友班)
- 模板朋友类和的C++错误
- 从朋友那里访问私有变量,我认为我的语法是错误的