在周末,我遇到了功能超载分辨率的具体问题,我似乎无法解决.下面的代码是问题的提炼:
#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的原因的任何澄清.此外,最终,有人可以提出一种方法来实现这一点,而不涉及创建另一个编译单元吗?
看这里: 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)
| 归档时间: |
|
| 查看次数: |
159 次 |
| 最近记录: |