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>.
我也知道要改进什么来进行编译,所以我并不是真的在寻找单行代码作为答案.我想知道为什么会这样!我尝试在网上搜索,但显然我没有使用正确的搜索参数.
我很确定这会帮助您理解:
您的代码无法编译:
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<> ,因为该常量根本不会出现在那里。