可能重复:
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>
类型的对象时发生。
我也知道要改变什么来进行编译,所以我并不是真的在寻找单行代码作为答案。我想了解为什么这种情况发生了!我尝试在网上搜索,但显然我没有使用正确的搜索参数。
答案 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;这种常数根本不存在的方式。