阅读C++ Templates: The Complete Guide,它说
请注意,模板不能在函数中声明
它不会对书中的任何其他章节或外部资源进行解释和/或交叉引用。
有人能帮我解释一下吗。这可能会在书的后面解释,但还没有。如果我之前解释过了,我一定是错过了。
示例:
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;
}
我也不理解来自gcc的错误消息。错误消息显示:
expected primary-expression before "template"
发布于 2011-05-17 22:50:09
问题可能与模板实现的历史方式有关:早期的实现技术(以及一些至今仍在使用的技术)要求模板中的所有符号都具有外部链接。(实例化是通过在单独的文件中生成等效代码来完成的。)在函数内部定义的名称永远不会有链接,并且不能在定义它们的作用域之外引用。
发布于 2019-01-11 23:25:44
答案“因为标准这么说”,当然是正确的,但让我们考虑一下通用的lambdas。
在C++14和C++17中,据我所知,泛型lambda是编写类似模板的代码的唯一方法:
auto lambda = [](auto x) { };
lambda.operator()<int>(0);
从技术上讲,你可以用它来编写任何类型的模板代码。不过,您必须努力绕过此方法的各种限制。
不过,在C++20中这会更简单。使用泛型lambdas中的模板参数列表,您将能够编写如下代码:
auto size = []<class T>() { return sizeof(T); };
static_assert(4 == size.operator()<int>());
GCC已经支持这种语法。
发布于 2010-08-10 21:07:27
简而言之,这是因为编写c/c++编译器和标准的人希望它是这样的。函数中的模板必须被认为太混乱和/或难以理解或解析,所以他们禁止这样做。
https://stackoverflow.com/questions/3449112
复制相似问题