Templates C+的等价性+;模板别名

Templates C+的等价性+;模板别名,templates,c++11,alias,using,Templates,C++11,Alias,Using,假设我有一个模板: template<typename T> struct Foo {int f1, f2;}; 模板 结构Foo{intf1,f2;}; 我想为它创建一个新别名 // This will not work, don't even try: // using Foo = Bar; // Instead do like this: template<typename T> using Bar = Foo<T>; //这行不通,甚至不要尝试

假设我有一个模板:

template<typename T>
struct Foo {int f1, f2;};
模板
结构Foo{intf1,f2;};
我想为它创建一个新别名

// This will not work, don't even try:
// using Foo = Bar;

// Instead do like this:
template<typename T>
using Bar = Foo<T>;
//这行不通,甚至不要尝试:
//使用Foo=Bar;
//相反,你应该这样做:
模板
使用Bar=Foo;
哇。它似乎起作用了。一开始 但是。。。如果我有这样的函数:

// Generic f:
template<template<typename> class Tpl>
void f() {std::cout<<"Generic f"<<std::endl;}

// Specialization of f for Foo:
template<> void f<Foo>() {std::cout<<"f<Foo>"<<std::endl;}

int main() {...; f<Bar>(); ...} //outputs "Generic f"
//通用f:
模板
void f(){std::cout
这是GCC4.8错误,还是C++11标准设计缺陷,还是预期会如此

事实上,具有讽刺意味的是,标准(草案)最初包含了一些示例,这些示例建议像您这样的示例可以使用。但规范性文本不允许这样做,并且对示例进行了修改,不再建议这样做

有没有办法在C++11和C++14中创建“真实”的模板别名


否。在讨论上述链接问题时,我们认为这是通用别名模板的一个非常特殊的情况,如果应该用直接表示别名的更简洁的语法来解决这一问题的话。别名模板最终会生成类型(并且在类型/typedef上模板化),而不是“模板别名”就像他们在早期起草时被调用一样。

你是指f和f吗?@Polkadtcadaver,当然不是。只要说不,不要轻视。你缺少了一个
类:
template
也许你可以说别名模板是别名的模板,而不是模板的别名。