【问题标题】:Template function overload resolution of T vs. SomeClass<T>T 与 SomeClass<T> 的模板函数重载解析
【发布时间】:2019-04-29 17:37:08
【问题描述】:

我想了解为什么void handleParam(const Str&amp; name, Table&lt;T&gt; value) 模板重载永远不会被实例化(请注意,下面的代码是说明性的)。我确信它不起作用有一个很好的理由,我只是想了解这个原因。我知道(并使用)使用中间模板结构的解决方法。但是,如果可能有类似下面的内容,它会大大简化我的代码。

class TypeHandler
{
public:
    TypeHandler(OtherClass& bi) : _bi(bi) { }

    template <typename T> void handleParam(const Str& name, Table<T> value)
    {
        // Never gets instantiated.
    }

    template <typename T> void handleParam(const Str& name, T value)
    {

    }
}

template<typename HandlerType>
void HandleParamValue::handleTab(DataBlock& data, HandlerType& handler) {

    ...

    // Table of floats.
    Table<float> tab;
    handler.handleParam<Table<float>>(param_name, tab);

    // etc.
    ...
}

template<typename HandlerType>
void ParamStore::Iterate(HandlerType& handler) {
    for (...) {

        ...

        if (is_table(type)) {
            HandleParamValue::handleTab<HandlerType>(_datablock, handler);
        }
        else {
            HandleParamValue::handle<HandlerType>(_datablock, handler);
        }
    }
}

// Kick the whole thing off.
TypeHandler handler(_some_instance);
_param_store->Iterate(handler);

【问题讨论】:

    标签: c++11 templates overload-resolution


    【解决方案1】:

    原因似乎很简单:如果你写

    handler.handleParam<Table<float>>(param_name, tab);
    

    您明确指定T = Table&lt;float&gt;。所以使用handleParam(const Str&amp; name, T value)。如果要使用handleParam(const Str&amp; name, Table&lt;T&gt; value),需要指定T = float

    handler.handleParam<float>(param_name, tab);
    

    甚至

    handler.handleParam(param_name, tab);
    

    因为编译器会自动选择最专业的版本。

    我使用以下代码进行测试:

    #include <iostream>
    #include <vector>
    
    class TypeHandler
    {
    public:
    
        template <typename T> void handleParam(const std::string& name, std::vector<T> value)
        {
            std::cout << "std::vector<T>\n";
        }
    
        template <typename T> void handleParam(const std::string& name, T value)
        {
            std::cout << "T\n";
        }
    };
    
    template<typename HandlerType>
    void handleTab(const std::string& name, HandlerType& handler) {
        std::vector<float> tab;
        handler.handleParam(name, tab);
    }
    
    int main()
    {
        TypeHandler t;
        handleTab("dfds", t);
        return 0;
    }
    

    如果它不能充分反映您的问题,请在评论中说明。

    【讨论】:

      猜你喜欢
      • 2013-09-28
      • 2015-08-21
      • 1970-01-01
      • 2016-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多