我们在编译以下源代码时观察到一个奇怪的行为: template<template<class> class TT> struct X { }; template<class> struct Y { }; template<class T> using Z = Y<T>; int main() { X<Y> y; X<Z> z; z = y; // it fails here } 这是一个从模板别名的c ++ 11标准提案中稍作修改的例子: http : //www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf (请参阅第4页)还要注意,提案“声明y和z是同一types”。 因此,在我们的解释中,应该可以从y分配(或复制构造)z。 但是,这个代码不能用gcc 4.8.1和clang 3.3编译。 这是编译器中的错误还是我们误解了标准? 在此先感谢,craffael等;) PS Clang错误信息是: error: no viable overloaded '=' note: […]
我想知道是否有可能写一个模板函数,可以采取任何其他任意模板作为参数,并正确匹配模板名称(即不只是结果类)。 我所知道的工作是这样的: template<template<typename …> class TemplateT, typename… TemplateP> void f(const TemplateT<TemplateP…>& param); 这将匹配例如f(std::vector<int>())或f(std::list<int>())但不会为f(std::array<int, 3>()) ,因为第二个参数是size_t而没有types。 现在我想可以做一些疯狂的事情: template<template<typename …> class TemplateT, size… Sizes, typename… TemplateP> void f(const TemplateT<Sizes…, TemplateP…>& param); 希望编译器能正确地派生TemplateP省略号或Sizes省略号为空。 但是,这不仅丑陋,而且还适用于采用type或size_t参数的模板。 它仍然不会匹配例如与bool参数的任意模板。 重载方法也是如此: template<template<typename …> class TemplateT, typename… TemplateP> void f(const TemplateT<TemplateP…>& param); template<template<typename …> class TemplateT, size… Sizes> void f(const TemplateT<Sizes…>& param); 此外,如果我们想要混合size_t和typenames ,这种方法不会工作。 […]
我已经看到一些使用模板模板参数(即以模板为参数的模板)的C ++示例来执行基于策略的类devise。 这种技术还有什么其他用途?