假设我有一个模板:
template<typename T>
struct Foo {int f1, f2;};
我想为它创建一个新的别名。
// This will not work, don't even try:
// using Foo = Bar;
// Instead do like this:
template<typename T>
using Bar = Foo<T>;
WOW。它似乎工作。首先。 但是......如果我有这样的功能:
// 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&lt; Foo&gt;和f&lt; Bar&gt;是f的不同专业!
所以:
谢谢。
答案 0 :(得分:5)
这是GCC 4.8的错误,还是C ++ 11的标准设计缺陷,或者预计是这样?
预计会如此。实际上,具有讽刺意味的是,标准(草案)最初包含了一些示例,这些示例表明了像您这样的示例。但是规范性文本并没有允许这样做,而且修改了这个例子以便不再提出这个问题。
请参阅http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1244
有没有办法在C ++ 11中创建“真正的”模板别名?在C ++ 14?
没有。决定这是一般别名模板的一个非常特殊的情况,如果在讨论上述链接问题时,应该使用直接表达别名的更清晰的语法来解决这个问题。别名模板最终产生类型(并且模仿类型/“typedef”)并且不是“模板别名”,就像它们在早期绘图中的某些时候被调用一样。