我的代码中有一个案例,我需要将一个依赖模板类作为朋友,但我认为我已经用尽了可能性,但没有一个能够工作。这有可能吗?如果是这样,怎么样?
最简单的例子:
struct Traits {
template <typename T>
struct Foo {
typedef typename T::bar* type;
};
};
template <typename T>
class Bar
{
typedef int bar;
// need to make T::Foo<Bar> a friend somehow?
typedef typename T::template Foo<Bar>::type type; // won't compile because bar is private...
// suppose I cannot make bar public.
type val;
};
int main() {
Bar<Traits> b;
}
答案 0 :(得分:1)
struct Traits {
template <typename T>
struct Foo {
typedef typename T::bar* type;
};
};
template <typename T>
class Bar
{
typedef int bar;
friend typename T::template Foo<Bar>;
typedef typename T::template Foo<Bar>::type type;
type val;
};
int main() {
Bar<Traits> b;
}
答案 1 :(得分:0)
答案 2 :(得分:0)
我能够在你的评论中插入它进行编译:
friend struct Traits::Foo<Bar>;
答案 3 :(得分:0)
老实说,你不会因为这样的事情而变得更好吗?
template <typename T>
class Bar;
struct Traits
{
public:
template <typename T>
struct Foo
{
typedef Bar<T> bar_type;
typedef typename bar_type::bar* type;
};
};
template <typename T>
class Bar
{
typedef int bar;
typedef Bar self_type;
typedef struct Traits::template Foo<T> traits_type;
friend traits_type;
typedef typename traits_type::type type;
type val;
};
int main(int argc,char** argv)
{
Bar<Traits> b;
}
允许包含公共typedef类型的任何东西比你的朋友更安全,尽管它很奇怪。