問題描述
我有一個類模板 Obj
和一個函數模板 make_obj
.Obj
定義了一個 private
單個構造函數,該構造函數接受對其要綁定到的模板化類型的引用.
I have a class template Obj
and a function template make_obj
. Obj
has a private
single constructor defined, which takes a reference to its templated type to bind to.
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
的,但沒有其他人可以(除了通過復制構造函數).
What I want is to declare the make_obj
function a friend
so that it can create Obj
's, but no one else can (except via the copy ctor).
我嘗試了幾個朋友聲明,包括
I have tried several friend declaration including
friend Obj make_obj(T&);
和
template <typename T1, typename T2>
friend Obj<T1> make_obj(T2&);
后者是對 Obj
類的 make_obj
朋友的所有模板實例化的不太理想的嘗試.但是,在這兩種情況下,我都會遇到相同的錯誤:
The latter being a less than desirable attempt at making all template instantiations of make_obj
friends of the Obj
class. However in both of these cases I get the same error:
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");
用于示例目的.
trying to do make_obj("hello");
for example purposes.
如何只允許 make_obj
訪問 Obj
的值構造器?
How can I allow only make_obj
access to Obj
's value contructor?
推薦答案
你需要一些前置聲明:
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);
}
實例
順便說一句:我不認為你真的想要 T &t;
用于您的類的成員變量.可能 T t;
是更好的選擇 ;)
And BTW: I don't think you really want T & t;
for your class' member variable. Probably T t;
is a better choice ;)
這篇關于聲明模板類的模板友元函數的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!