c++ - CRTP + enable_if 的好友功能不起作用?

标签 c++ templates c++11 variadic-templates crtp

以下代码无法编译,我不知道为什么:

#include <type_traits>

// Base class definition
template<template<typename> class CRTP, typename T> class Base
{
    // Friend function declaration
    public:
        template<template<typename> class CRTP0, typename T0, class>
        friend int func(const Base<CRTP0, T0>& rhs);

    // Protected test variable
    protected:
         int n;
};

// Friend function definition
template<template<typename> class CRTP0, typename T0,
class = typename std::enable_if<true>::type>
int func(const Base<CRTP0, T0>& rhs)
{
    return rhs.n;
}

// Derived class definition
template<typename T> class Derived : public Base<Derived, T> {};

// Main
int main()
{
    Derived<int> x;
    func(x);
    return 0;
}

GCC 4.6.2(和 LWS 上的 GCC 4.7.1)告诉我:

error: 'int Base<Derived, int>::n' is protected

这意味着基本上没有正确检测到友元。因为这只是我的代码的摘录,所以我想将 friend 函数的定义放在类定义之外,就像这里一样。那么,问题是什么以及如何解决?

编辑:我修改了代码以尝试隔离问题并使其更具可读性。当前的 enable_if 始终为真,但对于我的真实代码,我会有一个“真实”条件,这里只是为了隔离问题。

EDIT2:实时工作空间在这里:friend function problem

最佳答案

我在使用 gcc 时遇到了类似的问题。我认为这是一个编译器错误:因为你的函数模板有三个模板参数而不是友元声明中的两个,所以它不匹配它们。为了使您的意图与 gcc 一起正确工作,您必须完全匹配友元声明。这通过在函数返回类型上使用 SFINAE 最容易实现

 // Friend function definition
 template<template<typename> class CRTP0, typename T0>
 typename std::enable_if<true,int>::type
 func(const Base<CRTP0, T0>& rhs)
 {
    return rhs.n;
 }

关于c++ - CRTP + enable_if 的好友功能不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12027076/

相关文章:

c++ - 如何定义 boost::any 运算符 ==

c++ vector 迭代器转换错误

javascript - Angular 模板页面

c++ - 将 std::tuple<T...> 转换为 T

c++ - lambda 函数对象中的静态变量如何工作?

c++ - 查找数组中的最小元素及其索引

C++ 命名空间导出

c++ - 模板类中的模板函数

C++11 模板 : How to ensure that the type inherits a class?

c++11 - C++ 11 中的单例使用成员函数说明符