我正在尝试定义基类,它只包含typedef.
template<typename T>
class A
{
public:
typedef std::vector<T> Vec_t;
};
template<typename T>
class B : public A<T>
{
private:
Vec_t v; // fails - Vec_t is not recognized
};
Run Code Online (Sandbox Code Playgroud)
BI中为什么会收到Vec_t无法识别的错误,我需要明确写出来?
typename A<T>::Vec_t v;
Run Code Online (Sandbox Code Playgroud) 我有以下代码:
#include <iostream>
template <typename T>
struct Base
{
using Type = int;
};
template <typename T>
struct Derived : Base<T>
{
//uncommmenting the below cause compiler error
//using Alias = Type;
};
int main()
{
Derived<void>::Type b = 1;
std::cout << b << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在Type
,Derived
如果它在推导的上下文中,则可以使用typename - 如完全有效的声明所示b
.但是,如果我尝试Type
在其Derived
自身的声明中引用,那么我得到一个编译器错误告诉我Type
没有命名类型(例如,如果Alias
取消注释的定义).
我想这与编译器Type
在解析Derived
参数的特定实例化的上下文之外的定义时无法检查是否可以从基类中引入时有关T
.在这种情况下,这是令人沮丧的,因为Base
总是定义Type
不论T
.所以我的问题是双重的:
1).为什么地球会发生这种情况?通过这个我的意思是为什么编译器 …