功能过载解决问题

Joh*_*ohn 5 c++

在周末,我遇到了功能超载分辨率的具体问题,我似乎无法解决.下面的代码是问题的提炼:

#include <iostream>
using namespace std;

template<typename T>
void f(const T& t)
{
    cout << "In template function." << endl;
}

class C
{
public:
    void f() { cout << "In class function." << endl; }
    void g() { int i=0; f(i); }
    void h() { int i=0; f<int>(i); }
    void i() { extern void f(int); int i=0; f(i); }
};

int main()
{
    cout << "Test" << endl;
    C c;
    c.i();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

1)C :: g将无法编译,因为编译器不会尝试模板.它只是抱怨没有C :: f匹配.

2)C :: h不会无缘无故地编译,这对我来说是显而易见的.消息是"在'int'之前预期的primary-expression"

3)C :: i将编译,但(在评出g和h之后)它将不会链接到任何东西.我想我理解这一点:extern强迫链接器查看另一个编译单元,但任何模板定义都在这个编译单元中.

我将不胜感激有关1和2的原因的任何澄清.此外,最终,有人可以提出一种方法来实现这一点,而不涉及创建另一个编译单元吗?

seh*_*ehe 2

看这里: http: //ideone.com/zs9Ar

输出:


在模板函数中进行测试。

#include <iostream>
using namespace std;

template<typename T>
void f(const T& t)
{
    cout << "In template function." << endl;
}

class C
{
public:
    void f() { cout << "In class function." << endl; }
    void g() { using ::f; int i=0; f(i); }
};

int main()
{
    cout << "Test" << endl;
    C c;
    c.g();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)