【发布时间】:2019-04-20 20:34:21
【问题描述】:
通常,typename 用于区分标识符可能引用类型或引用其他内容的情况:
template<class T>
void foo(typename T::type value) {
// ...
}
当标识符已经是类型时,什么时候可以使用typename?
1.如果已经有同名的类可以使用吗?
class MyClass{};
void foo(typename MyClass value) {}
2.它可以与声明为类型的模板参数一起使用吗?
template<class T>
void foo(typename T value) {}
3. 可以与明确类型的内部类一起使用吗?
class A {
public:
class B {};
};
// Compiles; no typename necessary
void foo(A::B value) {}
// This compiles too on gcc and msvc
void bar(typename A::B value) {}
编译器解释
案例 1: MSVC 认为这没问题; gcc 和 clang 抛出错误
案例 2: MSVC 认为这没问题; gcc 和 clang 抛出错误
案例 3: A::B 无疑是一种类型,但 gcc 和 clang 现在允许使用 typename。
【问题讨论】:
标签: c++ syntax language-lawyer