我查看了一些相关的堆栈溢出线程,例如模板函数重载的这种情况,这让我无法理解
和
但似乎都没有给我我正在寻找的答案,至少不是一种容易让我解释的方式.
我的问题归结为:从设计和技术的角度来看,为什么这样做是合法的:
#include <iostream>
using namespace std;
template<class T>
void func(){
cout << "Compiler inferred from void return value!\n";
}
template<class T>
int func(){
cout << "Compiler inferred from int return value!\n";
return 0;
}
int main(){
void (*thisFunc)()=func<int>;
int (*thatFunc)()=func<int>;
thisFunc();
thatFunc();
}
Run Code Online (Sandbox Code Playgroud)
但不是这个:
#include <iostream>
using namespace std;
void func(){
cout << "You won't see this because it won't compile!\n";
}
int func(){
cout << "Nor this one!\n";
return 0;
}
int main(){
void …Run Code Online (Sandbox Code Playgroud) 我很难理解为什么以下代码无法编译:
template <class T>
class Base {
public:
Base(int a){}
};
template <class T>
class Derived: public Base<T> {
public:
Derived(int a): Base(a){}
};
int main(){}
Run Code Online (Sandbox Code Playgroud)
在我的编译器(gcc 5.4.0 with C++ 11)上输出错误消息
error: class 'Derived<T>' does not have any field named 'Base'
Derived(int a): Base(a){}
Run Code Online (Sandbox Code Playgroud)
我看到这有点类似于成员初始化列表错误中的模板基础构造函数调用,尽管该测试用例实际上为我编译而这个不是:主要区别似乎是两者Base并Derived使用相同的类型参数.另外,如果我明确添加类型参数或者为base提供明确的范围,它编译得很好,如
template <class T>
class Base {
public:
Base(int a){}
};
template <class T>
class Derived: public Base<T> {
public:
Derived(int a): Derived::Base(a){}
};
int main(){}
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?在注入类名时我是否会误解?