我今天正在玩C ++ 17的类模板参数演绎。想到的第一个明显的想法是传递一个可调用的模板参数。可赎回的,其中包括lambda,为什么不呢。我们来试试吧。
template<typename F> class foo
{
F f;
public:
foo(F in) : f(in) { f(); /* not very useful, admitted */ }
};
void bar() { puts("a"); }
int main()
{
auto a = foo(bar);
auto b = foo([](){ puts("b"); });
return (void) a, (void) b, 0;
}
以下是clang(5.0,r300688)对此的评价:
警告:功能&#39;&lt;(lambda at [source 位置])GT;&#39;有内部联系但没有定义
代码编译,当然&#34;工作正常&#34;但警告表明编译器并不完全满意。
我准备同意lambda具有内部链接(匿名它在同一个翻译单元的其他地方无法访问,所以肯定它在另一个翻译单元中无法访问),但是关于它。我想要从另一个翻译单元访问它 关于缺乏定义的部分让我感到好笑,我甚至不知道如何在不定义的情况下编写lambda。
总结:什么给出了什么?该怎么做?我不喜欢警告,不仅它们使构建不那么漂亮,而且它们通常意味着某些东西是错误的,各种不确定的行为可能很快就会让你感到厌烦。另一方面,如何通过写出它的定义来使lambda 更多地定义?
答案 0 :(得分:1)
在我看来,这是一个编译器故障。使用Visual Studio 2017的Clang编译器仅生成此错误“无法在没有模板参数列表的情况下引用类模板'foo'进行主函数中的a和b实例化。如果将函数类型指定为模板参数,则没有警告且没有错误。
答案 1 :(得分:0)
最近我遇到了一些与你的相似的无意义警告。我尝试了一堆手动修复的想法,我可以强制链接器的手(如果你愿意) - 但在一天结束时我意识到我正在尝试用{{1来编译C ++ 14代码标志。您可能需要仔细检查自己的标准标志(以及可能还有相应的-std=c++17
标志)。