gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:47:13 25 4
gpt4 key购买 nike

我有一个类模板 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com