C++部分模板模板特化

3
我希望将部分模板特化传递给模板模板参数,但是出现了错误。 我不确定为什么不能正常工作。
template<template<typename, int> class V, typename T, int N, int... Indexes>
class Swizzle
{
    // ...
};

template<typename T, int N>
struct Vector;

template<typename T>
struct Vector<T, 3>
{
    // ...

    union
    {
        // ...
        Swizzle<Vector, T, 3, 0, 0, 0> xxx;
    };
};

错误:

'Vector':对于模板参数“V”,无效的模板参数,预期为类模板'Swizzle':使用类模板需要模板参数列表

该问题仅出现在MSVC上。


1
你使用的编译器和标志是什么?这段代码足以重现问题吗?一旦我添加了一些分号,它在Coliru上对我有效。 - metal
实际上它在mingw730_32上运行正常。 - calynr
我正在使用VS2019并修复缺少分号的问题,但仍然出现错误。我尝试将我的其余代码粘贴到使用clang作为编译器的godbolt中,那样可以工作,所以我猜这一定是VS2019的错误? - sorte33
离题:在C++代码中使用union不是一个好主意。请注意,现代版本的unionstd::variant(c++17)。 - Marek R
2个回答

3

在类模板Vector中,Vector既指此模板实例的类型,也指模板本身。

这应该能编译通过:

template<class X, int M>
using Self = Vector<X,M>;
// ...

union
{
    // ...
    Swizzle<Self, T, 3, 0, 0, 0> xxx;
};

我怀疑这里MSVC有误,但不确定。


在clang和gcc上失败https://godbolt.org/z/Rox8M-,但是全局作用域中的类型定义可以正常工作:https://godbolt.org/z/NyKfLr - Marek R
@MarekR 已修复。只是名称冲突。 - Yakk - Adam Nevraumont

1
在具有类名注入的类中,Vector可能既是模板实例的类型,也可以指代模板本身。

在以下情况下,注入的类名将被视为类模板本身的模板名称:

[..]

  • 它被用作对应于模板模板参数的模板参数
因此,在这里Msvc是不正确的。
可能的解决方法:
Swizzle<::Vector, T, 3, 0, 0, 0> xxx;

演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接