这个问题已经在这里有了答案: 已关闭8年。 我以为我熟悉C++,但显然还不够熟悉。问题是,当您在模板类中定义常量时,可以在从该类派生的新类中使用该常量,但不能在从该类派生的新模板类中使用该常量。例如,gcc说 当我尝试编译此(简体)头文件时:#pragma oncetemplate <typename T> class base{ public: static const int theconstant = 42;};class derive1 : public base<size_t>{ public: derive1(int arg = theconstant) {}};template<typename T> class derive2 : public base<T>{ public: derive2(int arg = theconstant) {} // this is line 18};因此,问题在于一个类derive1可以很好地编译,而另一类derive2是模板专用化,却不能。现在也许gcc的错误还不够清楚,但是我不明白为什么derive2中的构造函数与derive1中的构造函数具有不同的作用域。如果很重要,这会在头文件本身的编译期间发生,而不是在实例化derive2<type>类型的对象时发生。我也知道要进行什么更改才能进行编译,因此我并不是真正在寻找单行代码作为答案。我想了解为什么会这样!我尝试搜索网络,但是显然我没有使用正确的搜索参数。 最佳答案 我很确定这将帮助您理解:您的未编译代码:template<typename T> class derive2 : public base<T>{ public: derive2(int arg = theconstant) {} // this is line 18};以及原因:template <> class base<size_t>{ public: static const int ha_idonthave_theconstant = 42;};derive2<size_t> impossible_isnt_it;特化!!!第18行的编译器无法确保不会以根本不存在该常量的方式来专门化base 。关于c++ - 模板类中定义的常量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11285732/ 10-12 07:32