2012-10-24 24 views
2

考虑下面的代码:为什么G ++不会为模板方法产生警告而不返回任何内容?

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()也没有返回任何东西。为什么不会产生警告,因为使用T = int实例化C2会使这两种方法的调用同样危险?

+1

你在编译时在某处实例化了'C2'吗? – Pubby

+0

[Works here](http://liveworkspace.org/code/3ea9d586eb0ce16cff833f15be02b0e7)。 –

+0

你真的叫过“方法”吗?编译器不会为未执行的模板函数生成代码。 –

回答

6

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

仅仅因为你可以使用模板的方式,就是坏了并不意味着你来,和COM ­堆垛机可让您在疑点利益。

还记得一个类模板的成员函数是只有在使用时才实例化。所以实际上的原因的错误是有C2<char> x; x.method();,并且确实会产生警告。

+0

有道理:如果没有实例化,编译器不能说它会做或者不会返回void。而且,只是实例化模板并不会给出警告,但调用方法的确如此,正如您所说的那样。感谢您的解释。 – Gabriel

+0

我想指出,即使没有模板变量返回类型*,函数也不会生成*。所以,如果你不调用'x.method2()',它将不会从原始问题中产生警告。 (刚刚意识到我自己) – Xymostech

+0

嗯。在这里,我使用g ++ 4.7.0,即使我不调用它,它也会为'method2'生成这个警告(我测试的代码正是我发布的代码,没有添加任何内容)。 – Gabriel

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(); 
} 
相关问题