现代C ++的新手,试图弄清楚这里发生了什么。以下代码可以正常编译:
template<int base_num>
class Base{
public:
Base() {}
};
template<int derived_num>
class Derived : public Base<0> { // Integer literal passed to base template
public:
Derived(): Base() {}
};
以下内容:
template<int base_num>
class Base{
public:
Base() {}
};
template<int derived_num>
class Derived : public Base<derived_num> { // Non-type template parameter passed to base template
public:
Derived(): Base() {}
};
失败:
类“ Derived
”没有任何名为“ Base”的字段
我推测是因为derived_num
本身不算作“结构类型”,但不确定。希望有人可以解释这里发生的事情,以及是否有办法将非类型模板参数“传递”到基类模板。
更新:
明确定义模板“修复”此问题
template<int derived_num>
class Derived : public Base<derived_num> {
public:
Derived(): Base<derived_num>() {}
};
但是对于更复杂的基本模板和多个构造函数来说,它们变得非常繁琐。如果可以避免,我希望这样做,但我仍然不明白为什么此修复程序也起作用。
更新2:
问题代码在GCC和clang失败,但是works on MSVC。编译器错误? (谁的bug,GCC / Clang或MSVC?)调用MSVC扩展?现在,我已经超出了我的想法,将耐心等待标准专家告诉我这里应该发生什么。