使用嵌套 class 继承模板 class
Inherit template class with nested class
我想创建一个继承自模板 class A 的 class B。并且我希望 B 的嵌套 class E 成为此继承中的模板参数。更直观:
template <class T>
class A {
}
class B : public A<B::E> {
class E {
int x;
}
}
class C : public A<C::E> {
class E {
int x;
int y;
}
}
我认为问题在于编译器在处理 B 的声明时不知道 class B 将具有嵌套的 class E,因为我得到错误:
no member named 'E' in 'B'
我看过这个similar question,但我想确认在放弃这种方法之前没有直接解决这个冲突的方法。
谢谢!
我能想到的最接近的方法是使用基数 class。
template <class T>
class A {
};
class B; // forward declaration of ::B
namespace detail {
class B {
friend class ::B;
class E {
int x;
};
};
} /* namespace detail */
class B : public A<detail::B::E> {
};
我认为不能直接完成。
一个明显的方法是在其他命名空间中定义 B::E
和 C::E
(至少让它们远离全局命名空间),然后在 [=21 中使用它们=] 类:
template <class T>
class A { /* ... */ };
namespace B_detail {
class E { /* … */ };
}
class B : public A<B_detail::E> { /* ... */ };
namespace C_detail {
class E { /* ... */ };
}
class C : public A<C_detail::E> { /* ... */ };
根据具体情况,您也很有可能 need/want 声明 *_detail::E
friend
of B/C。
正如其他人所说,您不能对嵌套 class 进行前向声明。
因此您可以将 嵌套 class 放在 namespace
中。或者,您可以只删除任何嵌套,但您必须提供不同的名称。
这是一个演示这两种方式的例子。如果您不需要前向声明,代码可能会更简单一些。
#include <memory>
template <class T>
class A {
public:
A();
// Demonstrate a possible way that T could be used.
std::unique_ptr<T> t;
};
template <class T>
A<T>::A() : t(std::make_unique<T>())
{
}
// Using a forward declared (top level) class...
class B : public A<class BE> {
};
class BE {
public:
int x;
};
// Using a forward declared class inside a namespace...
namespace C_details
{
class E;
}
class C : public A<C_details::E> {
};
namespace C_details
{
class E {
public:
int x;
int y;
};
}
int main()
{
B b;
b.t->x = 3;
C c;
c.t->y = 4;
return 0;
}
我想创建一个继承自模板 class A 的 class B。并且我希望 B 的嵌套 class E 成为此继承中的模板参数。更直观:
template <class T>
class A {
}
class B : public A<B::E> {
class E {
int x;
}
}
class C : public A<C::E> {
class E {
int x;
int y;
}
}
我认为问题在于编译器在处理 B 的声明时不知道 class B 将具有嵌套的 class E,因为我得到错误:
no member named 'E' in 'B'
我看过这个similar question,但我想确认在放弃这种方法之前没有直接解决这个冲突的方法。
谢谢!
我能想到的最接近的方法是使用基数 class。
template <class T>
class A {
};
class B; // forward declaration of ::B
namespace detail {
class B {
friend class ::B;
class E {
int x;
};
};
} /* namespace detail */
class B : public A<detail::B::E> {
};
我认为不能直接完成。
一个明显的方法是在其他命名空间中定义 B::E
和 C::E
(至少让它们远离全局命名空间),然后在 [=21 中使用它们=] 类:
template <class T>
class A { /* ... */ };
namespace B_detail {
class E { /* … */ };
}
class B : public A<B_detail::E> { /* ... */ };
namespace C_detail {
class E { /* ... */ };
}
class C : public A<C_detail::E> { /* ... */ };
根据具体情况,您也很有可能 need/want 声明 *_detail::E
friend
of B/C。
正如其他人所说,您不能对嵌套 class 进行前向声明。
因此您可以将 嵌套 class 放在 namespace
中。或者,您可以只删除任何嵌套,但您必须提供不同的名称。
这是一个演示这两种方式的例子。如果您不需要前向声明,代码可能会更简单一些。
#include <memory>
template <class T>
class A {
public:
A();
// Demonstrate a possible way that T could be used.
std::unique_ptr<T> t;
};
template <class T>
A<T>::A() : t(std::make_unique<T>())
{
}
// Using a forward declared (top level) class...
class B : public A<class BE> {
};
class BE {
public:
int x;
};
// Using a forward declared class inside a namespace...
namespace C_details
{
class E;
}
class C : public A<C_details::E> {
};
namespace C_details
{
class E {
public:
int x;
int y;
};
}
int main()
{
B b;
b.t->x = 3;
C c;
c.t->y = 4;
return 0;
}