请考虑以下代码:
template <typename T>
class C2 {
public:
T method() { }
int method2() { }
};
使用g++ -Wall -c -pedantic
进行编译会给我以下警告:
test.cpp: In member function ‘int C2<T>::method2()’:
test.cpp:4:29: warning: no return statement in function returning non-void [-Wreturn-type]
预期。奇怪的是method()
也没有返回任何东西。为什么不生成警告,因为使用C2
实例化T = int
会使对这两种方法的调用同样危险?
答案 0 :(得分:6)
如果您说T = void
,则不需要return
语句。
仅仅因为你可以以一种破碎的方式使用你的模板并不意味着你拥有,并且编译器可能会给你带来怀疑的好处。
还要记住,类模板的成员函数只有才会在使用时实例化。因此实际导致错误的方法是C2<char> x; x.method();
,这确实会产生警告。
答案 1 :(得分:1)
实际上你必须调用“method”才能让编译器编译它。毕竟这是一个模板功能。请参阅下面的代码中的评论。
template <typename T>
class C2 {
public:
T method() { }
int method2() { }
};
int main()
{
C2<int> c;
c.method2();
// If you comment out the below line, there is no warning printed.
c.method();
}