代码之家  ›  专栏  ›  技术社区  ›  Simon Lehmann

如何在方法模板中使用模板类型的引用传递参数?

  •  0
  • Simon Lehmann  · 技术社区  · 14 年前

    // ConfigurationContext.h
    
    class ConfigurationContext
    {
        public:
        template<typename T> T getValue(const std::string& name, T& default) const
            {
                ...
            }
    }
    

    在其他地方我想这样调用这个方法:

    int value = context.getValue<int>("foo", 5);
    

    出现以下错误:

    error: no matching function for call to 'ConfigurationContext::getValue(const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, int)'
    

    我检查了一些明显的错误,比如缺少包含之类的。但一切似乎都是对的。我尝试删除模板类型参数的pass by reference,如下所示:

    template<typename T> T getValue(const std::string& name, T default) const ...
    

    有人知道这里发生了什么,以及如何让这一切顺利进行吗?

    1 回复  |  直到 14 年前
        1
  •  6
  •   Community TheSoundDefense    7 年前

    5 是文本,不能将文本绑定到非- const 参考文献。要么接受 T 每份或每份 常数 参考文献:

    template<typename T> T getValue(const std::string& name, const T& def) const
    

    T default ,因为 default 是关键字,不能用作标识符。)

    您不能这样做的原因是因为每个非- 引用通常意味着被调用者可能会更改值,并且这些更改应该反映在调用者的位置上(请参阅) How to pass objects to functions in C++? )但是,不能更改文本或临时值。所以你不能把它们传给- 常数