模板类中定义的常量

时间:2012-07-01 21:24:20

标签: c++ templates g++ template-classes

  

可能重复:
  GCC problem : using a member of a base class that depends on a template argument

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

例如,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
};

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

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

2 个答案:

答案 0 :(得分:2)

尝试

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

基本上你已经为“theconstant”指定了不完整的范围。

答案 1 :(得分:2)

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

您的代码无法编译:

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行的编译器不能确定您不会专门化基础&lt;&gt;这种常数根本不存在的方式。