【问题标题】:Accessing base class typedef in derived class template在派生类模板中访问基类 typedef
【发布时间】:2016-02-02 18:05:47
【问题描述】:

我正在尝试从派生类模板访问基类中的 typedef 成员。模板中模板参数的名称与基类中的 typdef 名称相同。

#include <iostream>

using namespace std;
class no {
    public :
    typedef int T;
};
template<typename T> class no1 : public no {
    public :
    T obj;
};
int main() {
    // your code goes here
    no1<string> o ; o.obj = "1";
    return 0;
}

14:24: error: invalid conversion from 'const char*' to 'no::T {aka int}' [-fpermissive]
  no1<string> o ; o.obj = "1";

在上面的代码中,T is obj 总是 int 类型。如何强制 obj 成为模板参数而不是基类中声明的 typdef?

谢谢

【问题讨论】:

  • 您必须提供从Tint 的显式转换。另请注意,T 模板参数只是 shadows no::T,这些是不相关的。
  • 这就是我的问题是如何在不更改基类或重命名模板参数的情况下访问 T 模板参数?
  • 顺便说一句,我想知道为什么这被否决了。很明显,这是一个 MCVE,答案很明显。
  • 有一种解决方法是让no1 从一个依赖的基础派生(在no1no 之间的交互层次结构中插入一个类模板)。这对你来说是一个可以接受的改变吗?请注意,该 hack 将适用于 GCC 和 Clang,但目前不适用于 MSVC。抄送@ChristianHackl

标签: c++ templates


【解决方案1】:

这对我有用:

template<typename T> class no1;
template<typename T>
struct underlying_type_of;

template<typename T>
struct underlying_type_of<no1<T> >
{
   typedef T type;
};
template<typename T> class no1 : public no {
public :
  typename underlying_type_of<no1>::type obj;
};

【讨论】:

    猜你喜欢
    • 2012-09-12
    • 2010-12-11
    • 2014-03-13
    • 1970-01-01
    • 2018-09-18
    相关资源
    最近更新 更多