首页 > 解决方案 > 使用独立于模板的 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

看这里

我观察到的是:

这是 g++ (8.2) 错误还是 clang++ 违反标准,在后一种情况下,如何触发函数的代码生成?

标签: c++templatesg++friend-function

解决方案


这是一个 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);
}

推荐阅读