Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数模板:typename声明_C++_Templates - Fatal编程技术网

C++ 函数模板:typename声明

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

在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;
};
模板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
作为类型名来声明指针。