如何解决 MSVC 不推导模板模板参数的问题

问题描述 投票:0回答:1

有一个非常相似的问题,但我不明白如何将解决方法应用到我的代码中。更多的是为了实现不同容器类型之间的通用性:Visual C++ 无法推导模板模板参数

重申一下:在某些情况下,由于不符合标准的行为,MSVC 似乎无法将模板模板参数推导到模板函数。 Clang 和 GCC 编译良好。有没有一种方法可以使代码编译而不必在每次调用模板函数时显式声明模板参数?

https://godbolt.org/z/PYe3aoYaM

旁注:我不认为应该需要可变参数

<class...>
,但它解决了一个减少的问题(这里 Clang 和 GCC 也接受了它而没有
...

#include <vector>
#include <memory>

// A generic vector type that should be interchangeable.
template <typename T>
using MyVec = std::vector<T>;  // adding std::allocator<T> does not help

// Type to define a vector of owning references.
template <typename T, template <class...> typename C>
using Group = C<std::unique_ptr<T>>;

// Type to define a vector of non-owning references.
template <typename T, template <class...> typename C>
using GroupRef = C<T*>;

// Convert owning references to non-owning ones.
template <typename T, template <class...> typename C>
GroupRef<T, C> toRef(const Group<T, C>& arg)
{
    GroupRef<T, C> result;
    for (const auto& p : arg) {
        result.push_back(p.get());
    }
    return result;
}

int main() {
    Group<int, MyVec> g;
    // Error: "no matching overloaded function found"
    auto x = toRef(g);
    // This works:
    //auto x = toRef<int, std::vector>(g);
}

c++ templates c++20 template-argument-deduction template-templates
1个回答
0
投票

不确定是否可以接受,但添加一些

Ts...
修复MSVC编译:

// Type to define a vector of owning references.
template <typename T, template <class...> typename C, typename... Ts>
using Group = C<std::unique_ptr<T>, Ts...>;

// Convert owning references to non-owning ones.
template <typename T, template <class...> typename C, typename...Ts>
GroupRef<T, C> toRef(const Group<T, C, Ts...>& arg)
{
    GroupRef<T, C> result;
    for (const auto& p : arg) {
        result.push_back(p.get());
    }
    return result;
}

演示

© www.soinside.com 2019 - 2024. All rights reserved.