8

可能重复:
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
};

所以问题是一个类 ,derive1编译得很好,但另一个类 ,derive2是一个模板专业化,却没有。
现在也许 gcc 的错误还不够清楚,但我不明白为什么 in 中的构造函数的derive2作用域与derive1.
万一这很重要,这发生在头文件本身的编译期间,而不是在实例化类型的对象时derive2<type>

我也知道要进行哪些更改才能进行编译,因此我并不是真的在寻找单行代码作为答案。我想了解为什么会这样!我尝试在网上搜索,但显然我没有使用正确的搜索参数。

4

2 回答 2

2

尝试

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

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

于 2012-07-01T21:39:49.760 回答
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 行的编译器无法确定您不会专门化 base<> 以使该常量根本不存在。

于 2012-07-01T22:36:03.243 回答