模板类中定义的常量

Mr *_*ter 8 c++ templates g++ template-classes

可能重复:
GCC问题:使用依赖于模板参数的基类成员

我以为我熟悉C++,但显然不够熟悉.
问题是当您在模板类中定义常量时,可以在从该类派生的新类中使用常量,但不能从派生自它的新模板类中使用常量.

例如,gcc说

test.h:18:错误:未在此范围内声明'theconstant'

当我尝试编译这个(简化的)头文件时:

#pragma once

template <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
};
Run Code Online (Sandbox Code Playgroud)

所以问题是一个类derive1编译得很好,但是另一个类derive2,它是模板特化,却没有.
现在也许gcc的错误还不够清楚,但是我不明白为什么构造函数的derive2范围不同于derive1.
如果它很重要,这会在编译头文件本身时发生,而不是在实例化类型的对象时derive2<type>.

我也知道要改进什么来进行编译,所以我并不是真的在寻找单行代码作为答案.我想知道为什么会这样!我尝试在网上搜索,但显然我没有使用正确的搜索参数.

Pio*_*ycz 2

我很确定这会帮助您理解:

您的代码无法编译:

template<typename T> class derive2 : public base<T>
{
  public:
    derive2(int arg = theconstant) {} // this is line 18
};
Run Code Online (Sandbox Code Playgroud)

以及原因:

template <> class base<size_t>
{
  public:
    static const int ha_idonthave_theconstant = 42;
};
derive2<size_t> impossible_isnt_it; 
Run Code Online (Sandbox Code Playgroud)

专业化!!!第 18 行的编译器无法确定您不会专门化 base<> ,因为该常量根本不会出现在那里。