模板来自模板,但编译器抱怨未从基本模板中清除标识符
Template intherit from template but compiler complains about not decleared identifiers from base template
我有以下情况:
template <class A, typename B, typename C, class D>
class Base
{
public:
// ctor and virtual dtor
// functions
class Inner
{
//...
};
protected:
// members
};
template <class E>
class Sub : public Base<std::string, float, double, E>
{
public:
// ctor and virtual dtor
// functions using Inner class inherit from Base
};
虽然 msvc 编译得很好(Visual Studio 2012 with ctp nov 2012 编译器),但 gcc(从 Trunk 构建的 4.9.0)抱怨从 Base 使用的每个成员以及来自 Base 的内部类。
我注意到 msvc 在模板方面非常放松,但是我还需要在带有 gcc 的 Linux 下运行和编译这段代码。那么,msvc 接受但 gcc 不接受的虚假代码在哪里?
核心问题是不依赖于模板参数的名称是在声明时查找的,而不是在实例化时查找的。使用例如 Base<std::string, float, double, E>::Inner
而不仅仅是 Inner
,或者在您的类中放置一个 using 声明:using Base<std::string, float, double, E>::Inner
。这将使名称依赖,从而在实例化时查找。
有关详细信息,请搜索"依赖名称查找"。
相关文章:
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- #ifdef和未声明的标识符
- 清除前检查矢量
- f2、f3、f4标识符未找到
- 设置 Visual Studio for MPI: 找不到标识符错误
- 未声明的标识符编译暗黑破坏神 2 程序"muleview"
- ifstream文件在从行中读取时被清除
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- Google protobuf 时间戳未声明标识符,在 Windows 上具有C++
- 如何让 GCC/Clang 在保留标识符上出错
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- 当简单捕获中的标识符显示为参数的声明符 ID 时,没有编译器诊断
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- 使用说明符 extern 声明的C++中的标识符链接
- C++:枚举:错误:应使用标识符而不是"}"
- 为什么我们不能重复使用具有不同模板参数的别名模板标识符?
- Visual Studio C++ PlaySound 标识符未定义
- 为什么我们不编写可以处理C++标识符的汇编器和链接器?
- C2065 - 未清除的标识符
- 模板来自模板,但编译器抱怨未从基本模板中清除标识符