#include <iostream>
class A {
public:
typedef int my_t;
};
template <class T>
class B {
public:
// T::my_t *ptr; // It will produce compilation error
typename T::my_t *ptr; // It will output 5
};
int main() {
B<A> b;
int my_int = 5;
b.ptr = &my_int;
std::cout << *b.ptr;
std::cin.ignore();
return 0;
}
template<class T> class MyClass{}; // these two cases are
template<typename T> class MyNewClass{}; // exactly the same.
他们之间没有区别,他们是完全一样的。
B)在使用 < em > 嵌套依赖类型名称 作为模板前。
template<class T>
void foo(const T & param)
{
typename T::NestedType * value; // we should use typename here
}
不使用 typename会导致解析/编译错误。
我想对第二种情况进行补充,正如 Scott Meyers 的书 有效的 C + + 中提到的,在 < em > 嵌套的依赖类型名称 之前使用 typename是一个例外。例外的情况是,如果您使用 < em > 嵌套的依赖类型名称 作为 基础课程或在 成员初始化列表中,您不应该在那里使用 typename:
template<class T>
class D : public B<T>::NestedType // No need for typename here
{
public:
D(std::string str) : B<T>::NestedType(str) // No need for typename here
{
typename B<T>::AnotherNestedType * x; // typename is needed here
}
}
注意: 对于第二种情况(即在嵌套依赖类型名称之前)使用 typename是不需要的,因为 C + + 20。