【问题标题】:How to use pass-by-reference arguments of template type in method templates?如何在方法模板中使用模板类型的传递引用参数?
【发布时间】:2011-03-31 07:11:18
【问题描述】:

我目前正在努力编译以下代码。首先是包含一个带有方法模板的类的头文件:

// 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)'

我检查了明显的错误,例如缺少包含和类似的东西。但一切似乎都是正确的。我尝试像这样删除模板类型参数的传递引用:

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

然后它编译没有任何错误并且运行良好,但我仍然想在这里传递一个参考......

有谁知道这里发生了什么以及如何进行这项工作?

【问题讨论】:

    标签: c++ templates methods pass-by-reference


    【解决方案1】:

    5 是文字,您不能将文字绑定到非const 引用。每个副本或每个 const 参考都采用T

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

    (顺便说一句,我怀疑您的编译器是否接受T default,因为default 是关键字,不能用作标识符。)

    您不能这样做的原因是,为每个非const 引用获取参数通常意味着被调用者可能会更改值,并且此类更改应反映在调用者处。 (请参阅How to pass objects to functions in C++?)但是,您不能更改文字或临时变量。所以你不能将它们传递给非const 引用。

    【讨论】:

    • 当然,现在说得通了……我现在可能不应该再编码了(2:46 CEST)。感谢您的快速帮助! (哦,我实际上并没有在我的代码中使用 T 默认值,只是缩短了所有内容以使其更清晰......)
    • 我想知道为什么在这种情况下编译器不能给出有意义的消息。
    • @chubsdad:C++ 是一种难以解析的语言,实现者正忙于让他们的编译器接受 valid 代码并正确猜测出现的问题以防万一无效代码需要时间。 (Comeau,可能是最符合标准的编译器,也带有非常好的错误消息。)而且,对于 C++ 标准,这个错误消息并不是那么糟糕。至少它不是真正的误导。 (如果您想看到一个误导新手的错误消息,请删除类声明末尾的分号,这是某些标题中的最后一件事。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多