如何将模板函数声明为模板化嵌套类的朋友?

时间:2017-11-05 05:53:38

标签: c++ templates friend

如何在可以访问get的私有构造函数的封闭范围内创建outer<T>::inner<U>函数?

template <typename T>
struct outer {
    template <typename U>
    class inner {
        inner() {}
    public:
        friend inner get(outer&) {
            return {};
        }
    };
};


int main() {
    outer<int> foo;
    outer<int>::inner<float> bar = get<float>(foo);
}

我已经尝试通过让inner拥有template <typename V, typename W> friend inner<V> get(outer<W>&);来宣布课外,但这也不起作用。

1 个答案:

答案 0 :(得分:5)

  

我尝试通过让inner拥有模板<typename V, typename W> friend inner<V> get(outer<W>&);

来宣布课外宣传

你需要在friend声明之前声明模板函数,告诉编译器get是一个函数模板。 e.g。

// definition of outer
template <typename T>
struct outer {

    // forward declaration of inner
    template <typename U>
    class inner;
};

// declaration of get
template <typename V, typename W> 
typename outer<W>::template inner<V> get(outer<W>&);

// definition of inner
template <typename T>
template <typename U>
class outer<T>::inner {
    inner() {}
    public:
    // friend declaration for get<U, T>
    friend inner<U> get<U>(outer<T>&);
};

// definition of get
template <typename V, typename W> 
typename outer<W>::template inner<V> get(outer<W>&) {
    return {};
}

LIVE