现代 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() {}
};
Run Code Online (Sandbox Code Playgroud)
而以下内容:
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() {}
};
Run Code Online (Sandbox Code Playgroud)
失败:
类 'Derived<derived_num>' 没有任何名为 'Base' 的字段
我推测发生这种情况是因为derived_num它本身不算作“结构类型”,但不确定。希望有人可以解释这里发生了什么,以及是否有办法将非类型模板参数“传递”到基类模板。
更新:
显式定义模板“修复”了这个
template<int derived_num>
class Derived : public Base<derived_num> {
public:
Derived(): Base<derived_num>() {}
};
Run Code Online (Sandbox Code Playgroud)
但是对于更复杂的基本模板和多个构造函数变得非常麻烦。如果可以避免,我想,但我仍然不明白为什么此修复程序也有效。
更新 2:
问题代码在 GCC 和 clang 上失败,但在 MSVC 上有效。编译错误?(谁被窃听了,GCC/Clang 还是 MSVC?)调用 MSVC 扩展?现在非常不合我意,会耐心等待标准专家告诉我这里应该发生什么。