C++ 函数模板中的模板参数存在问题

C++ 函数模板中的模板参数存在问题,c++,templates,C++,Templates,我正在尝试使用模板参数,我的代码将无法编译 template<class DataType, template<class T> class Container> void foo(Container<DataType> test) { } int main() { std::vector<int> testVec{1,2,3,4}; foo<int, std::vector>(testVec);

我正在尝试使用模板参数,我的代码将无法编译

template<class DataType, template<class T> class Container>
void foo(Container<DataType> test)
{
    
}

int main()
{
    std::vector<int> testVec{1,2,3,4};
    
    foo<int, std::vector>(testVec);
}
模板
void foo(容器测试)
{
}
int main()
{
std::向量testVec{1,2,3,4};
foo(testVec);
}
错误消息是 “没有与调用'foo'匹配的函数。”

  • 已忽略候选模板:为模板参数“Container”显式指定的参数无效
  • 有人能帮我吗?

    建议:试一下

    // ...............................VVVVVVVVV
    template<class DataType, template<class ...> class Container>
    void foo(Container<DataType> test)
    {
        
    }
    
    您需要接受单一类型模板参数的模板参数

    因此,您可以解决询问两个类型模板参数的问题

    // ...............................VVVVVVVVVVVV
    template<class DataType, template<class, class> class Container>
    
    // ...............................VVVVVVVVV
    template<class DataType, template<class ...> class Container>
    
    /..vvv
    模板
    
    或者,更灵活地说,类型模板参数的可变列表

    // ...............................VVVVVVVVVVVV
    template<class DataType, template<class, class> class Container>
    
    // ...............................VVVVVVVVV
    template<class DataType, template<class ...> class Container>
    
    /..vvv
    模板
    
    正如HolyBlackCat(谢谢)所指出的,您的代码(因此模板参数要求一个单一类型的模板参数)应该在C++17之前失败,但应该从C++17开始接受(匹配规则已更改)

    不幸的是,这适用于g++但不适用于clang++:默认情况下,clang++开发人员没有实现这个新的C++17匹配规则

    但是HolyBlackCat报告也允许clang++接受您的代码,添加一个特殊参数:
    -frelaxed template-template-args

    建议:使用

    // ...............................VVVVVVVVV
    template<class DataType, template<class ...> class Container>
    void foo(Container<DataType> test)
    {
        
    }
    
    您需要接受单一类型模板参数的模板参数

    因此,您可以解决询问两个类型模板参数的问题

    // ...............................VVVVVVVVVVVV
    template<class DataType, template<class, class> class Container>
    
    // ...............................VVVVVVVVV
    template<class DataType, template<class ...> class Container>
    
    /..vvv
    模板
    
    或者,更灵活地说,类型模板参数的可变列表

    // ...............................VVVVVVVVVVVV
    template<class DataType, template<class, class> class Container>
    
    // ...............................VVVVVVVVV
    template<class DataType, template<class ...> class Container>
    
    /..vvv
    模板
    
    正如HolyBlackCat(谢谢)所指出的,您的代码(因此模板参数要求一个单一类型的模板参数)应该在C++17之前失败,但应该从C++17开始接受(匹配规则已更改)

    不幸的是,这适用于g++但不适用于clang++:默认情况下,clang++开发人员没有实现这个新的C++17匹配规则



    但是HolyBlackCat报告也显示clang++接受您的代码,并添加了一个特殊参数:
    -frelaxed template-template-args

    请在问题中包含完整的错误消息。我的编译器告诉我出了什么问题。如果您不理解错误消息,其他人会理解,在任何情况下,错误消息都是您应该用来修复错误的error@idclev463035818添加错误消息是必须的,但公平地说,GCC在这里毫无帮助,使用经典的
    注意:模板参数推断/替换失败
    。我添加了错误消息。谢谢both@HolyBlackCat被推荐的候选人经常对我帮助很大。出于某些原因,提问者通常会跳过所有附加信息,并将注意力集中在消息的“它不起作用”版本上。请在问题中包含完整的错误消息。我的编译器告诉我出了什么问题。如果您不理解错误消息,其他人会理解,在任何情况下,错误消息都是您应该用来修复错误的error@idclev463035818添加错误消息是必须的,但公平地说,GCC在这里毫无帮助,使用经典的
    注意:模板参数推断/替换失败
    。我添加了错误消息。谢谢both@HolyBlackCat被推荐的候选人经常对我帮助很大。出于某些原因,询问者通常会跳过所有附加信息,并将注意力集中在消息的“它不工作”版本上,或者OP可以添加
    -std=c++17
    ,那么代码应该按原样工作。@HolyBlackCat-你确定吗?我是说。。。我知道C++17改变了一些关于模板匹配的内容(不幸的是,我永远记不清到底是什么),但我看到g++(编译C++17)接受了clang++(也是最新版本,也是编译C++20)的代码给出了一个错误。IIIRC Clang开发人员拒绝实现此更改,因为他们认为新的措辞有缺陷,因为它毫无理由地破坏了一些旧代码。如果传递
    -frelaxed template-template-args
    ,则Clang会接受它。有趣的是,这并不要求
    std::vector
    是可变模板。现在我想知道是否有可能有一个模板参数,只匹配变量templates@max66我想我要问一个问题,只是需要一些时间来准备一个好的案例,或者OP可以添加
    -std=c++17
    ,那么代码应该按原样工作。@HolyBlackCat-你确定吗?我是说。。。我知道C++17改变了一些关于模板匹配的内容(不幸的是,我永远记不清到底是什么),但我看到g++(编译C++17)接受了clang++(也是最新版本,也是编译C++20)的代码给出了一个错误。IIIRC Clang开发人员拒绝实现此更改,因为他们认为新的措辞有缺陷,因为它毫无理由地破坏了一些旧代码。如果传递
    -frelaxed template-template-args
    ,则Clang会接受它。有趣的是,这并不要求
    std::vector
    是可变模板。现在我想知道是否有可能有一个模板参数,只匹配变量templates@max66我想我要问一个问题,只是需要一些时间来准备一个好的案例