gpt4 book ai didi

c++ - 如果 T 是模板参数,语句 T::x(y) 有何歧义?

转载 作者:行者123 更新时间:2023-11-30 00:57:04 25 4
gpt4 key购买 nike

我正在阅读这个网址上的情况说明书

http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fkeyword_typename.htm

我意识到我不知道 T::x 可能代表什么类型。这是摘录

template<class T> class A
{
T::x(y);
typedef char C;
A::C d;
}

The statement T::x(y) is ambiguous. It could be a call to function x() with a nonlocal argument y, or it could be a declaration of variable y with type T::x. C++ will interpret this statement as a function call. In order for the compiler to interpret this statement as a declaration, you would add the keyword typename to the beginning of it. The statement A::C d; is ill-formed. The class A also refers to A and thus depends on a template parameter. You must add the keyword typename to the beginning of this declaration:

我想了解为什么会有类型为 T::x 的变量 y,这将如何工作以及这可能意味着什么? x 是什么?

谢谢:-)

最佳答案

作为我的完整答案的热身,请考虑以下内容:

template <typename T> void IterateOverContainer(T container) {
/* Error! */
T::iterator itr(container.begin());
}

在这里,iterator是嵌套在 T 中的类型;例如,std::vector<int>::iterator .为避免此处出现歧义,typename关键字变得必要:

template <typename T> void IterateOverContainer(T container) {
/* Now good! */
typename T::iterator itr(container.begin());
}

现在这“很明显”是一个类型的名称(这就是 typename 的意思!),所以很明显我们想要声明一个变量而不是调用一个函数。

就是说,有了新的 C++11 功能,您可以使用 auto 完全回避这个问题:

template <typename T> void IterateOverContainer(T container) {
auto itr(container.begin());
}

或者,更明确地说:

template <typename T> void IterateOverContainer(T container) {
auto itr = container.begin();
}

现在,关于您的问题:T::x(y) 怎么可能曾经声明过变量吗?好吧,由于 C 的一个奇怪的怪癖,这是一个完全合法的变量声明:

int (x);

一样
int x;

所以如果我们有这样的东西:

template <typename T> void IterateOverContainer(T container) {
/* Error! */
T::iterator(itr);
}

这可以解释为一个名为 itr 的变量的声明类型 T::iterator ,或作为对函数 T::iterator 的调用路过itr作为参数。 typename的使用消除它是哪一个的歧义。

有趣的是,额外括号的规定与 Most Vexing Parse 的原因相同。存在。我希望你永远不会遇到它。 :-)

希望这对您有所帮助!

关于c++ - 如果 T 是模板参数,语句 T::x(y) 有何歧义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9123396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com