2

考虑以下代码:

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

4

2 回答 2

6

如果您说T = void,则无需return声明。

仅仅因为您可以以一种被破坏的方式使用您的模板并不意味着您必须这样做,并且编译器可能会给您带来怀疑的好处。

还要记住,类模板的成员函数只有在使用时才会被实例化。因此,实际导致错误的方法是 have C2<char> x; x.method();,这确实会产生警告。

于 2012-10-24T23:11:22.853 回答
1

您实际上必须调用“方法”才能让编译器编译它。毕竟是模板函数。请参阅下面代码中的注释。

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();
}
于 2012-10-24T23:20:13.970 回答