【问题标题】:Dependent Types: Template argument deduction failed依赖类型:模板参数推导失败
【发布时间】:2015-10-11 00:32:29
【问题描述】:

在我的代码中,我将模板化图像类 Image<T>std::shared_ptr 结合使用。这些图像指针应该被传递给各种图像处理函数,其中一些函数与图像类型无关。考虑以下Image<T>的定义,以及function1()function2()两个处理函数。

#include <memory>

template <typename T>
struct Image
{
    typedef std::shared_ptr<Image<T>> Ptr;
};

template <typename T>
void function1 (typename Image<T>::Ptr image) {}

template <typename T>
void function2 (std::shared_ptr<Image<T>> image) {}

虽然function1()function2() 实际上具有相同的签名,但function1() 更易于阅读并隐藏了指针如何实现的细节。但是,在没有明确指定模板类型的情况下,我无法调用 function1()。考虑以下代码:

int main (void)
{
    Image<int>::Ptr image = std::make_shared<Image<int>>();
    function1(image);       // Does NOT compile
    function1<int>(image);  // Does compile
    function2(image);       // Does compile
    return 0;
}

第一次调用导致编译错误的地方:

example.cc: In function 'int main()':
example.cc:18:19: error: no matching function for call to 'function1(MyClass<int>::Ptr&)'
example.cc:18:19: note: candidate is:
example.cc:10:6: note: template<class T> void function1(typename MyClass<T>::Ptr)
example.cc:10:6: note:   template argument deduction/substitution failed:
example.cc:18:19: note:   couldn't deduce template parameter 'T'

我的问题如下:是否可以使用function1() 的签名而无需手动指定模板参数?是什么导致编译器错误?

我怀疑问题是由Image&lt;T&gt;::Ptr 是依赖类型引起的。因此编译器在编译时无法知道该字段的确切定义。是否有可能告诉编译器这个字段没有特化,本着typename 关键字的精神,它告诉编译器一个字段是一个类型?

【问题讨论】:

    标签: c++ templates c++11 type-inference


    【解决方案1】:

    导致编译器错误的原因是什么?

    您(仅)在非推断上下文中使用 Tnested-name-specifiers。也就是说,您将T 放在一个名称中,该名称仅指定类型所在的位置。编译器无法理解您的实际意图,必须尝试大量T

    是否可以使用function1() 的签名而无需手动指定模板参数?

    不是真的。如果您想要一种更简洁的方式来引用指向图像的智能指针,您可以使用别名模板:

    template <typename T>
    using ImagePtr = std::shared_ptr<Image<T>>;
    

    然后写function1

    template <typename U>
    void function1(ImagePtr<U> p) {}
    

    【讨论】:

    • @Barry 好吧,我还没有检查 VC++ 中的一个疯狂的错误是否使它在那里工作,但是是的 - 没有。
    猜你喜欢
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 2021-07-01
    • 2018-02-28
    相关资源
    最近更新 更多