为什么G ++不为模板方法生成警告而不返回任何内容?

时间:2012-10-24 23:02:57

标签: c++ templates g++ warnings

请考虑以下代码:

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会使对这两种方法的调用同样危险?

2 个答案:

答案 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();
}