【发布时间】:2016-02-28 14:02:35
【问题描述】:
几天以来我一直遇到模板问题,您一次解决了我的每一个问题,所以提前感谢您。
所以我有一个模板 (tl1) 关心 uml composition,另一个模板 (tl2) 就是 uml composed
因此,如果composed 对象不是tl2 的derived 并且typename D 不是tl1 derived,我的目标是不编译。
#include <type_traits>
#include <list>
#include <string>
template <typename T, typename C>
class tl2 ;
template <typename D, typename T>
class tl1 {
private:
static_assert(std::is_base_of<tl2<T, D>, T>::value, "T should inherit from tl2");
std::list<T> mTs ;
tl1() {} ;
friend D ;
public:
T & getTbyName() const ;
};
template <typename T, typename C>
class tl2 {
//static_assert(std::is_base_of<tl1<C, T>, C>::value, "D should inherit from Database");
public:
std::string getName() { return mName ; }
private:
C & mC ;
std::string mName ;
};
class cl1 ;
class cl2 : public tl2<cl2, int> {
};
class cl1 : public tl1<int, cl2> {
};
我的问题是这个编译得很好,我不想。
我不想编译,因为来自tl1<D, T> 的D 必须来自tl1 的derived。
实际上class cl1 : public tl1<int, cl2> 不正确,但它可以编译。那为什么呢?
如果我将cl1 更改为:
class cl1 : public tl1<int, cl2> {
cl1() {}
};
我明白为什么更改后它不编译,但我不明白为什么它之前编译。
事实上tl1 和tl2 将在库中,所以我想在库中执行所有检查。我无法控制派生,所以我想确定implementation 是tlX derived。
再次感谢您的光临。
昆汀
【问题讨论】:
-
"我的问题是这个编译得很好,我不想。"为什么?通常问题是某些东西无法编译,而您希望它能够编译。 “如果我将 cl1 更改为:......” cl1 已按照您的指示定义,并且编译没有任何问题。你的问题不清楚,而且令人困惑。你需要澄清它们。
-
@SamVarshavchik 现在描述更清楚了吗?
-
std::is_base_of<tl2<T, D>, T>::value检查 T 是否派生自 tl2但您在哪里检查 std::is_base_of<Tl1, D>::value(D 派生自 Tl1)。 -
@Brandon 我试过了,但它不能编译我认为这是因为
tl1在class cl1 : public tl1<int, cl2>中不知道D