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