C++ 函数模板:typename声明
在GCC上,下面给出了一个错误:C++ 函数模板:typename声明,c++,templates,C++,Templates,在GCC上,下面给出了一个错误:在“struct type”中没有名为“x”的类型。 在VC++上,它抱怨p未声明 struct Type { static int const x = 0; }; template <class T> void Func() { typename T::x * p; // p to be pointer } int main() { Func<Type>(); } 结构类型 { 静态int常数x=0; }; 模板v
在“struct type”中没有名为“x”的类型。
在VC++上,它抱怨p
未声明
struct Type
{
static int const x = 0;
};
template <class T> void Func()
{
typename T::x * p; // p to be pointer
}
int main()
{
Func<Type>();
}
结构类型
{
静态int常数x=0;
};
模板void Func()
{
typename T::x*p;//p为指针
}
int main()
{
Func();
}
T::x
变成Type::x
,它是一个int
,而不是一个类型
您已经告诉编译器,
T::x
使用typename
命名类型。当实例化Func
时,T::x
不是类型,因此编译器报告错误。T::x
变成type::x
,它是int
,而不是类型
您已经告诉编译器,
T::x
使用typename
命名类型。当实例化Func
时,T::x
不是一个类型,因此编译器会报告一个错误。因为type::x
不是一个类型,而是一个值,所以当您编写typename
时,您告诉编译器在type
中找到一个名为x
的嵌套类型,但它找不到。因此,GCC在“struct type”中表示没有名为“x”的类型,这比VC++生成的消息更有用。因为type::x
不是一个类型,而是一个值,所以当您编写typename
时,您告诉编译器在type
中找到一个名为x
的嵌套类型,但它找不到。因此,GCC在“struct type”中表示没有名为“x”的类型
,这比VC++生成的消息更有用。在C++11中,using关键字可用于类型别名
struct Type
{
using x = static int const;
};
在C++11中,using关键字可用于类型别名
struct Type
{
using x = static int const;
};
@詹姆斯:问题是VC++并没有抱怨Type::x
不是类型!代码格式不正确。Visual C++报告诊断。这就是所需要的一切。诊断消息可能没有它可能有帮助,但这是一个QOI问题,而不是一个bug。G++和Visual C++都有许多不太有用的诊断信息,它们往往会误导人。该代码无效,将被拒绝。错误消息不一定是漂亮的。@James:正确。删除了那个部分。@James:bug是VC++没有抱怨Type::x
不是类型!代码格式不正确。Visual C++报告诊断。这就是所需要的一切。诊断消息可能没有它可能有帮助,但这是一个QOI问题,而不是一个bug。G++和Visual C++都有许多不太有用的诊断信息,它们往往会误导人。该代码无效,将被拒绝。错误消息不一定是漂亮的。@James:正确。删除了那个部分。我明白了,我想我需要在类型中嵌套一个类来封装整数x。好吧,这取决于你到底想做什么:-/我只想在前面使用关键字“typename”,但把内置类型与类类型混淆了。谢谢。@user31231:“混淆了内置类型和类类型”不,你混淆了类型和对象。内置类型和类之间没有太大区别。但是不能用对象的名称来代替类型名称。我明白了,我想我需要在类型中嵌套一个类来封装整数x。这取决于你到底想做什么:-/我只是想在前面使用关键字“typename”,但把内置类型与类类型混淆了。谢谢。@user31231:“混淆了内置类型和类类型”不,你混淆了类型和对象。内置类型和类之间没有太大区别。但是不能用对象的名称代替类型名。那么呢?无效代码很容易导致不同编译器发出完全不同的诊断消息。您的代码无效。只要编译器发出诊断消息以响应您的代码,该编译器就正常。顺便问一下,你的问题是什么?我的问题是关于使用变量x
作为类型名来声明指针。那么?无效代码很容易导致不同编译器发出完全不同的诊断消息。您的代码无效。只要编译器发出诊断消息以响应您的代码,该编译器就正常。顺便说一句,你的问题是什么?我的问题是关于使用变量x
作为类型名来声明指针。