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 = voidreturnステートメントは必要ありません。

テンプレートを壊れた方法で使用できるからといって、そうしなければならないわけではなく、コンパイラーが疑いの恩恵を与えている可能性があります。

また、クラステンプレートのメンバー関数は、使用された場合にのみインスタンス化されることに注意してください。したがって、実際にエラーを発生させる方法は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 に答える