3

一个简单的 c++ 文件和类 TT 有两种方法。

#include <map>
#include <string>
#include <iostream>

using namespace std;

class TT{ 
    public:
        TT(const string& str);
        template<class T>T Read(const string& key)const;
        template<class T>T Read(const string& key, const T& value)const;
};

TT::TT(const string& str){
    cout<<str<<endl;
}

template<class T>T TT::Read(const string& key)const{
    std::cout<<key<<std::endl;
    return 1;
}

template<class T>T TT::Read(const string& key, const T& value)const{
    std::cout<<key<<'\t'<<value<<std::endl;
    return value;
}

int main(void){
    TT tt("First");

    tt.Read("Hello", 12);
    return 1;
}

如果更换

tt.Read("Hello world!", 12);

tt.Read("Hello world!");

主()

G++ 说:

new.cc:31: 错误:没有匹配函数调用 'TT::Read(const char [5])'</p>

为什么 G++ 找不到Read(const string& key)const方法?

谢谢!

4

3 回答 3

6

您正在尝试定义一个返回 T 的函数:

template<class T>
T TT::Read(const string& key) const
{
    std::cout << key << std::endl;
    return 1;
}

但是,您总是int从这个函数返回一个。您要么需要这样称呼它:

tt.Read<int>("Hello");

或者删除模板定义,因为这里没有意义。

于 2012-11-27T03:22:51.173 回答
1

您的函数template<class T>T Read(const string& key)const;在类型 T 上模板化,但 T 仅作为返回类型出现。

如果您打算手动将返回类型烘焙到您的函数中(并且看起来像是从 的外观return 1;),您可以将声明更改为:

int Read(const string& key) const;

否则,您必须在调用中手动指定模板类型,如下所示:

tt.Read<int>("Hello");

这归结为这样一个事实,即当模板化类型仅作为返回出现时,函数不能推导出模板化类型。

C++ 标准在标题为:

Explicit template argument specification [temp.arg.explicit]

如果所有的模板参数都可以推导出来,那么它们都可以被省略;在这种情况下,空模板参数列表 <> 本身也可以省略。在演绎完成但失败的上下文中,或在演绎未完成的上下文中,如果指定了模板参数列表,并且它与任何默认模板参数一起标识单个函数模板特化,则模板 ID 是左值用于功能模板专业化。

template<class X, class Y> X f(Y);

int i = f<int>(5.6); // Y is deduced to be double
int j = f(5.6); // ill-formed: X cannot be deduced
于 2012-11-27T03:23:07.493 回答
1

我相信这是因为在处理模板时,编译器想知道返回函数是什么,即使它返回 1,它也是一个 int,它也无法弄清楚。从技术上讲return 1可能是一个错误,因为它不知道返回值应该是什么。

采用tt.Read<int>("Hello");

于 2012-11-27T03:23:31.980 回答