0

我有这个代码:

    class XMLNode
    {
        //...
        template <typename T>
        bool getValue(T& t, const std::string& path) const
        {
            if (empty())
            {
                throw std::runtime_error("Empty node");
            }
            return nsXML::getValue(t, path, *node);
        }

        template <typename T>
        T getValue(const std::string& path) const
        {
            if (empty())
            {
                throw std::runtime_error("Empty node");
            }
            return nsXML::getValue<T>(path, *node);
        }
        //...
    };

class XMLData
{
    //...
    template <typename T>
    T getValue(const std::string& path)
    {
        return XMLNode(&mDocNode, 0).getValue(path); // ERROR LINE
    }
    //...
};

并给我错误

no matching function for call to ‘nsXML::XMLNode::getValue(const string&)’
note: candidates are:
note: template<class T> bool nsXML::XMLNode::getValue(T&, const string&) const
note: template<class T> T nsXML::XMLNode::getValue(const string&) const

为什么g++给我这个错误?

4

2 回答 2

1

编译器无法评估您要使用哪种类型来实例化函数模板。在这种情况下,您必须明确指定它:

return XMLNode(&mDocNode, 0).getValue<T>(path);
                                   // ^-- explicit instantiation

只有在某些情况下,模板参数才能由编译器从函数参数中自动推导出来:

int i;
bool b = XMLNode(&mDocNode, 0).getValue(i, path);

在这里,编译器将 int 视为第一个函数参数,并且可以推断出此函数调用的 T 为 int,因此它与

bool b = XMLNode(&mDocNode, 0).getValue<int>(i, path);
于 2013-08-21T12:43:48.820 回答
0

因为您的 XMLNode::getValue(const std::string& path) 函数是一个 const,所以当它调用 nsXML::getValue 时,它​​正在寻找 const 版本,我猜没有定义一个 const 。

注意 const 成员函数和非 const 成员函数是不同的。

于 2013-08-21T12:42:05.563 回答