我正在处理带有模板化朋友函数的模板化类
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)
)see here链接成功与g ++。hidden
公开并删除友元声明时,代码链接正常(因此函数模板被实例化)。int
工作正常。template <typename … , typename = typename enable_if_t<…>>
,但是在这里我无法编译,因为g ++和clang ++告诉我朋友声明不允许默认模板参数。f(X<int>, X<float>)
并且曾经在X<int>
定义。这是一个g ++(8.2)错误还是clang ++违反了标准,在后一种情况下,我该如何触发函数的代码生成?
这是一个g ++(8.2)错误,还是clang ++违反了标准
我怀疑gcc是正确的。模板朋友是语言的一个黑暗角落。
如何触发函数的代码生成?
我是通过一个友好的演员来做的。
X<float>