【发布时间】:2018-08-25 05:37:27
【问题描述】:
我有这样的模板类结构。
我的目标是禁止创建那些没有提供完整专业化的课程:
class AbstractContainer
{
public:
virtual ~AbstractContainer() = default;
// declare here interface methods
};
template <class T>
class Container final : public AbstractContainer
{
public:
Container() = delete;
};
template <>
class Container<int> : public AbstractContainer
{
public:
Container() = default;
explicit Container(const int& type) : AbstractContainer(), type_(type){}
private:
int type_;
};
一切正常
Container<int> a; // it works
Container<int> a(5); // it works
Container<char> a; // does not compile
但我注意到它可以针对这些情况进行编译
Container<int> a(Container<char>());
Container<int> a(Container<CustomClass>());
如何避免这种情况?我确实想要一个复制构造函数,但没有错误的类型,理想情况下我希望遇到同样的编译错误问题(我可以在某处使用断言,但不知道如何设置它)。
【问题讨论】:
-
这引出了一个问题,为什么有一个默认模板?
-
@StoryTeller 你的意思是为什么不直接删除默认模板或者为什么不使用没有模板的继承?
-
后者。您实质上是在这里定义整个类。甚至不要使用主节点可以提供的“默认实现”
-
@StoryTeller 我可能想在未来使用和管理默认实现并保持打开大门
-
普通班也关不上门。但没关系,这是您的代码库。你可能比我有更清晰的观点。
标签: c++ c++11 templates default-constructor most-vexing-parse