- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试使用 g++ 编译一些以前在 Visual C++ 2008 Express Edition 下开发的代码,看起来 g++ 不允许我调用模板方法在模板变量的方法返回的引用上。我能够将问题缩小到以下代码:
class Inner
{
public:
template<typename T>
T get() const
{
return static_cast<T>(value_);
};
private:
int value_;
};
class Outer
{
public:
Inner const& get_inner() { return inner_; };
private:
Inner inner_;
};
template<typename T>
int do_outer(T& val)
{
return val.get_inner().get<int>();
}
int main()
{
Outer outer;
do_outer(outer);
return 0;
}
这段代码在微软的编译器下可以正常编译,但是 g++ 会抛出一个错误:
$ g++ -c main.cpp
main.cpp: In function ‘int do_outer(T&)’:
main.cpp:24: error: expected primary-expression before ‘int’
main.cpp:24: error: expected ‘;’ before ‘int’
main.cpp:24: error: expected unqualified-id before ‘>’ token
第 24 行指的是 return val.get_inner().get<int>();
.
如果我做 do_outer
接收 Outer
的正常方法引用代码编译。制作Inner::get()
一个正常的方法也有效。并制作Inner::get()
返回 void 并接收模板参数也有效,因为下面的 int 说明符变得不需要了,即:
class Inner
{
public:
template<typename T>
void get(T& val) const
{
val = static_cast<T>(value_);
};
private:
int value_;
};
...
template<typename T>
int do_outer(T& val)
{
int i;
val.get_inner().get(i);
return i;
}
...
(g++ 不会提示上面的代码。)
现在我没主意了。有什么问题? gcc/g++ 有问题吗?我的代码是否存在合规性问题?
我使用的编译器是:
$ g++ --version
g++ (Ubuntu 4.3.3-5ubuntu4) 4.3.3
最佳答案
只是为了提供一些关于为什么 template
的背景。需要关键字:
template<typename T>
int do_outer(T& val)
{
int i;
val.get_inner().get<int>(i);
return i;
}
当编译器看到这个函数时,它不知道val
的类型是什么是。因此它解析行 val.get_inner().get(i)
如下:
1:val .
编译器看到 .
因此可以假设“val”具有类类型,下一个标识符是成员对象或函数的名称。
<强>2。 val . get_inner (
get_inner
是成员的名称,然后编译器会看到 (
.唯一的可能性是 get_inner
是一个函数名,所以这是一个函数调用。然后它解析参数,直到找到结束符 )
。 .
<强>3。 val . get_inner () .
至于第一步,它现在知道 get_inner 的返回必须是类类型,因此它知道下一个标识符是成员对象或函数。
<强>4。 val . get_inner () . get <
那么,<
可以做什么?可能是什么意思当然它是模板参数的开始......或者它可能是小于运算符?
我们知道get
只能是对象或函数。如果它是一个对象,那么 <
作为小于运算符非常有意义。此外,标准或多或少指出只有在 <
之前的名称是 template-name
它会治疗<
吗作为模板参数 (14.2/3):
After name lookup (3.4) finds that a name is a template-name, if this name is followed by a
<
, the<
is always taken as the beginning of a template-argument-list and never as a name followed by the less-than operator.
在这种情况下,编译器不知道表达式 val.get_inner()
的类型是什么是所以它不能查找get
.它或多或少地假设它是一个成员对象而不是模板名称。 '<' 被视为小于运算符,编译器最终检查是否 get
小于 int
- 因此错误。
那么,为什么修复会起作用?
添加 template
关键字
从字面上看,我们是在告诉编译器 get
是一个模板名称,所以 <
运算符被视为模板参数列表的开始。
移除模板参数
当 do_outer 没有模板参数时即:val . get_inner () . get (
编译器期望成员 get
是一个对象或一个函数。 (
消除这两者之间的歧义,名称被视为一个函数。稍后模板参数推导然后计算出模板参数的类型。
关于c++ - g++ 不喜欢模板 var 上的模板方法链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1574721/
假设您有下表,名为 Likes: A|B --- a|b a|f a|e a|i b|a b|i c|d e|p 在此表中,A 中的值表示“喜欢”B 中的人。因此,a 喜欢 b,a 喜欢 f,a 喜欢
请访问此处观看直播https://ibnul.neocities.org/_temporary/au2pr4/like-dis-icon-active-effect.html 这里我有多个评论部分,每
我想要一个喜欢/不喜欢的超链接来在我的页面上显示不同的内容:当点击“喜欢”时,显示“好”;单击“不喜欢”时,显示“不好”。我的代码是这样的: function Homepage(){ t
我们已经建立了一个 Facebook Page Tab application用Like Gate .我们之前已经做过无数次了,在这方面,这个应用程序没有任何异常。 在我们的 ASP.Net 4.0
我正在尝试在我的页面上实现一个喜欢/不喜欢按钮。我设法让按钮工作(点击时它会变成喜欢,反之亦然),它还会在数据库表上创建或删除类似的东西。现在的问题是喜欢的计数器。它仅在我第一次单击按钮时有效,即如果
我想在我的 Android 应用程序中集成一个赞按钮。我用了代码 likeWebView = (WebView) findViewById( R.id.webView1 ); likeWebView
我有一个漫画网站,我希望用户可以为每部漫画和每件艺术品一次投票。 我的代码似乎有两个问题: 1) 我只希望一个用户每张图片投票一次...所以我想捕获他们的信息并将其存储在数据库中。我有一个 ON DU
我正在开发 web 应用程序,我必须像 facebook 那样实现“喜欢”系统。应用程序将包含客户可以“喜欢”的几类产品。所以我开始创建数据库,但遇到了一个障碍。据我了解,有两种方法可以做到这一点:
我需要一个 mysql 查询方面的帮助。我无法找到特定查询的解决方案。我什至不确定,如果 LIKE 运算符是我正在寻找的。 我想要实现的是,找到所有包含 url 的行,如果该 url 不是 foo.c
如何为 Like 编写动态 LINQ 方法条款。 供引用,有Dynamic LINQ OrderBy on IEnumerable / IQueryable .我正在寻找一个类似的动态 Like条款。
This question already has answers here: Cumulative number of unique values in a column up to current
我需要任何用户能够每 24 小时点赞一次 我为此写了一个函数 const LIKE_HEART = 'like_heart'; const LIKE_FINGER = 'like_finger'; p
让我在这里解释一下整个事情,以便您可以清楚地了解情况: 我在 Facebook 上有一个页面,这些见解(页面上的和来自图形 API 的)为我提供了很多有值(value)的信息,但我需要更深入。我正在考
给定这个脚本: DECLARE @token NVARCHAR(max) SET @token = 'mytexttosearchfor' SELECT * FROM myTable WHERE my
我怎样才能做一个Like-query,要搜索多个值? $searchWords = explode(' ', Input::get('search')); 然后我得到一组用于搜索的单词。 我怎样才能通
我正在尝试在页面上制作一个“赞”按钮,但似乎无法使其正常工作。基本上有三个函数使用ajax将数据发送到更新数据库的php页面。我已经检查了数据库并且所有三个更新都正确。如果用户最初不喜欢并单击,它会正
我有两张 table 在“用户”表中,每个用户都有一些技能。它们位于单个列上并连接在一起。在表“技能”上,每个技能都有一个关联的标签。 碰巧有些用户的技能不再在表“技能”中引用。 我想做的选择应该列出
所以我正在尝试设计一个数据库来跟踪观看次数、喜欢次数和下载次数。现在要跟踪的条目数量预计为 1m 或更多,所以通常我会每天跟踪每个条目,但对于 1m,我担心性能甚至可能是硬盘大小。 客户希望能够显示上
我像在 Firebase 事件数据库中一样实现了该系统。点赞计数器位于 EventModel -> likesInfo -> likesNumber 处。问题在于数据发散,例如,如果两个用户快速(0.
假设两个用户正在使用一个应用程序,并已授予该应用程序适当的权限来检索他们的点赞。是否可以使用 FQL 或图形 api 来查找他们的共同点?类似于如何使用图形 API 在两个用户之间找到共同的 frie
我是一名优秀的程序员,十分优秀!