首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在C++中,typename应该在const之前还是之后?

在C++中,typename应该在const之前还是之后?
EN

Stack Overflow用户
提问于 2017-05-11 01:04:13
回答 3查看 3.3K关注 0票数 3

我应该这样写吗:

代码语言:javascript
代码运行次数:0
运行
复制
template<class T> class Foo {
    typename const T* x;
};

或者:

代码语言:javascript
代码运行次数:0
运行
复制
template<class T> class Foo {
    const typename T* x;
};
EN

回答 3

Stack Overflow用户

发布于 2017-05-11 01:17:34

typename需要与您尝试获取的类型相匹配。例如,如果您有

代码语言:javascript
代码运行次数:0
运行
复制
template <typename T>
void foo(T& t)
{
    typename const T::iterator bar = t.begin();
}

int main()
{
    std::vector<int> bar{1,2,3}
    foo(bar);
}

您将得到一个针对typename const T::const_iterator bar = t.begin();的编译器错误,如下所示

应在“const”之前使用嵌套名称说明符

Where as

代码语言:javascript
代码运行次数:0
运行
复制
const typename T::iterator bar = t.begin();

工作得很好。

有关templatetypename需要出现的时间、位置和原因的全面解释,请参阅:Where and why do I have to put the "template" and "typename" keywords?

票数 4
EN

Stack Overflow用户

发布于 2017-05-11 01:17:13

typename不是这样使用的,所以这两种情况都是无效的,应该会产生编译错误,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
main.cpp:4:20: error: expected a qualified name after 'typename'
    const typename T* x;
                   ^

在这里,您需要像T::myType这样的东西才能继续运行。

或者甚至是这样,更糟糕的是:

代码语言:javascript
代码运行次数:0
运行
复制
main.cpp:4:14: error: expected a qualified name after 'typename'
    typename const T* x;
             ^
main.cpp:4:14: error: expected member name or ';' after declaration specifiers

expected a qualified name after 'typename'中的相关例子。

引入关键字typename是为了指定后面的标识符是一个类型

更多信息请访问:Officially, what is typename for?

票数 3
EN

Stack Overflow用户

发布于 2017-05-11 01:18:08

在这里使用typename没有任何意义。

如果要访问T::type这样的别名类型,则必须使用,因为在这种类型中,不能在typenameT::type之间使用const

代码语言:javascript
代码运行次数:0
运行
复制
const typename T::type * x;  // ok
typename T::type const * x;  // ok
typename const T::type * x;  // error
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43898730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档