c++ - 声明模板类的模板友元函数

标签 c++ templates c++11 friend

我有一个类模板 Obj 和一个函数模板 make_objObj 定义了一个 private 单个构造函数,该构造函数采用对其模板化类型的引用来绑定(bind)。

template <typename T>
class Obj {
  private:
    T& t;
    Obj(T& t)
        : t{t}
    { }
};

template <typename T>
Obj<T> make_obj(T& t) { 
    return {t};
}

我想要的是将 make_obj 函数声明为 friend 以便它可以创建 Obj 的,但没有其他人可以(除了通过复制ctor)。


我尝试了几个 friend 声明,包括

friend Obj make_obj(T&);

template <typename T1, typename T2>
friend Obj<T1> make_obj(T2&);

后者在使 Obj 类的所有 make_obj friend 的模板实例化方面不太理想。但是在这两种情况下,我都会遇到相同的错误:

error: calling a private constructor of class 'Obj<char const[6]>'
    return {t};
           ^

note: in instantiation of function template specialization
      'make_obj<const char *>' requested here
    auto s = make_obj("hello");
             ^

出于示例目的尝试执行 make_obj("hello");

如何只允许 make_obj 访问 Obj 的值构造函数?

最佳答案

你需要一些前向声明:

template <typename T>
class Obj;

template <typename T>
Obj<T> make_obj(T t);

template <typename T>
class Obj {
private:
    T & t;
    Obj (T & t) : t(t) { }
    Obj() = delete;

    friend Obj make_obj<T>(T t);
};

template <typename T>
Obj<T> make_obj(T t) { 
    return Obj<T>(t);
}

live example

顺便说一句:我不认为你真的想要 T & t; 作为你类的成员变量。可能 T t; 是更好的选择 ;)

关于c++ - 声明模板类的模板友元函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18792565/

相关文章:

javascript - 如何将外部 HTML 文件导入 TypeScript 类

C++17 使用选定的构造函数在堆栈中构造数组(每个数组条目的构造函数参数值相同)

c++ - C++中的最大线程数

c++ - 从类型包中解压缩模板-模板参数

ruby-on-rails - rails : render partial with selected controller and action in view

c++ - 使用派生自 `std::get` 的元素在 `std::tuple` 上调用 `std::tuple` - 格式错误?

c++ - 在堆栈和堆上创建对象数组

c++ - 语法繁重的多个 lambda 包装器的替代方案——如何避免样板代码?

c++ - 抽象类上的模板类

python - boost python : tie lifetime of argument to returned value using return_internal_reference