阅读C++模板:完整指南,它说
请注意,模板不能在函数中声明
它不对书中的任何其他章节或外部资源给出解释和/或交叉引用.
有人可以帮忙解释一下.可能它会在本书后面解释,但还没有.如果先前解释过,我一定错过了它.
例:
int main()
{
class DummyClass // This compiles ok
{
int object;
};
template <typename T> // compile error "expected primary-expression before "template""
class DummyTemplate
{
T object;
};
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我也不明白gcc的错误信息.错误消息说:
expected primary-expression before "template"
Run Code Online (Sandbox Code Playgroud)
Jam*_*nze 39
问题可能与实现模板的历史方式有关:早期实现技术(以及今天仍在使用的一些技术)要求模板中的所有符号都具有外部链接.(实例化是通过在单独的文件中生成等效代码来完成的.)函数内定义的名称永远不会有链接,也不能在定义它们的范围之外引用.
D. *_*riy 10
答案“因为标准是这么说的”,当然是正确的,但让我们考虑一下通用 lambda。
据我所知,在 C++14 和 C++17 中,通用 lambda 是编写类似模板代码的唯一方法:
auto lambda = [](auto x) { };
lambda.operator()<int>(0);
Run Code Online (Sandbox Code Playgroud)
从技术上讲,您可以用它编写任何类型的模板代码。尽管您必须努力解决此方法的各种限制。
不过在 C++20 中这会更简单。使用泛型 lambda 中的模板参数列表,您将能够编写如下代码:
auto size = []<class T>() { return sizeof(T); };
static_assert(4 == size.operator()<int>());
Run Code Online (Sandbox Code Playgroud)
GCC 已经支持这种语法。
| 归档时间: |
|
| 查看次数: |
7673 次 |
| 最近记录: |