【问题标题】:Why does gcc tell me that my template is not a template?为什么 gcc 告诉我我的模板不是模板?
【发布时间】:2019-01-25 05:30:29
【问题描述】:

我有这么一段代码:

template<template<typename> class ContainerType,
         typename ValueType,
         typename ReturnType>
struct value_extractor
{
public:
    static ReturnType extract(const ContainerType<ValueType>&);
};

template<template<typename> class ContainerType,
         typename ValueType>
struct value_extractor<ContainerType, ValueType, std::shared_ptr<ValueType>>
{
    static std::shared_ptr<ValueType> extract(const ContainerType<ValueType>& value)
    {
        return value;
    }
};

本质上是从模板类型中提取值。这段代码使用 clang 编译得很好,但是使用 gcc 我得到一个错误提示:

g++ test.cpp -lstdc++ -O2 
In file included from di.hpp:1:0,
                 from test.cpp:2:
holders.hpp: In instantiation of ‘ReturnType di::holder<ContainerType, ValueType>::provide() const [with ReturnType = std::shared_ptr<int>; ContainerType = std::shared_ptr; ValueType = int]’:
di.hpp:35:105:   required from ‘static ReturnType di::holder_selector::convert(const types_map&, ContainerType<ValueType>*) [with ReturnType = std::shared_ptr<int>; ContainerType = std::shared_ptr; ValueType = int; di::types_map = std::unordered_map<void (*)(), std::unique_ptr<di::base_holder> >]’
di.hpp:40:39:   required from ‘T di::injector::provide() const [with T = std::shared_ptr<int>]’
test.cpp:14:63:   required from here
holders.hpp:48:85: error: ‘di::value_extractor<ContainerType, ValueType, std::shared_ptr<_Up> >::extract(const ContainerType<ValueType>&) [with ContainerType = std::shared_ptr; ValueType = int]’ is not a template [-fpermissive]
 alue_extractor<ContainerType, ValueType, ReturnType>::template extract(value_);
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~

如果我使用-fpermissive 标志,代码可以编译,甚至可以工作,但显然会发出警告。 所以我的问题是:真的是我还是 gcc 的错误,如果是我在编写不合格的代码,那么我应该如何解决它? 提前致谢。

【问题讨论】:

  • 调用extract时不需要::template
  • @songyuanyao 天哪,谢谢,真是个愚蠢的错误。到目前为止我的眼睛都模糊了:)

标签: c++ c++11 templates metaprogramming


【解决方案1】:

调用提取时不需要模板,愚蠢的错误。 感谢@songyuanyao

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 2022-01-15
    相关资源
    最近更新 更多