私は(明らかに)次の無効なコードの有効なC++ 11と同等やりたい:私は私のコンパイラから以下のエラーが出C++テンプレートメソッドの戻り型を他のクラスの静的メソッドの戻り型として宣言するにはどうすればよいですか?
class StaticMethodClass {
public:
static int staticMethod(int a) {return 0;}
};
#include <type_traits>
template<class T> class ClassTemplate {
public:
decltype(T::staticMethod(int)) methodTemplate(int a);
};
template<class T>
decltype(T::staticMethod(int)) ClassTemplate<T>::methodTemplate(int a) {
return T::staticMethod(a);
}
template class ClassTemplate<StaticMethodClass>;
を:
/tmp$ g++ -std=c++11 -c a.cpp
a.cpp:14:26: error: expected primary-expression before ‘int’
decltype(T::staticMethod(int)) ClassTemplate<T>::methodTemplate(int a) {
^
a.cpp:14:32: error: prototype for ‘decltype (T:: staticMethod(<expression error>)) ClassTemplate<T>::methodTemplate(int)’ does not match any in class ‘ClassTemplate<T>’
decltype(T::staticMethod(int)) ClassTemplate<T>::methodTemplate(int a) {
^
a.cpp:10:36: error: candidate is: int ClassTemplate<T>::methodTemplate(int)
decltype(T::staticMethod(int)) methodTemplate(int a);
^
/tmp$ g++ -dumpversion
4.8.3
は、私が欲しいものです可能ですか?もしそうなら、どうですか?
。しかし、実装をクラス外に移動すると、同じ問題が発生します。改訂されたコードを参照してください。 –