ページ 11

(*this)を返すメンバ関数を持つクラス

Posted: 2013年5月24日(金) 05:47
by zxc
  
  環境;WinXP,VCE++2010
  次のようなクラスを作りました。

コード:

//////Graph.h(他の関数等略)//////////////
class Graph{
 	private:
		Size<int> size;
	public:
		Graph& operator()()const;
};

コード:

/////Graph.cpp(他の関数等略)///////
Graph& Graph::operator()()const{
	return (*this);
}
  このGraphクラスのoperator()は「 error C2440: 'return' : 'const Graph' から 'Graph &' に変換できません。」ということでコンパイルが通りません。

しかし

コード:

////////size.h(他の関数等略)///////
template<typename T>
class Size{
	public:
		Size& operator()()const;
};

コード:

///////size.cpp(他の関数等略)////////////////
template<typename T>
Size<T>& Size<T>::operator()()const{
	return (*this);
}
  こちらのsizeクラスのoperator()についてはエラーが出ないようです。

  エラーC2440はどうやらキャストに関するエラーのようですが、返り値の型の扱いはsizeクラスもGraphクラスもoperator()については、自分には同じに見えます。いったいどこが不適切なのでしょうか。

Re: (*this)を返すメンバ関数を持つクラス

Posted: 2013年5月24日(金) 08:15
by h2so5
テンプレートクラスの場合もエラーは出ますよ。
http://ideone.com/fpA98a

テンプレートの定義だけして実体化していないからエラーが出ないだけでは?

Re: (*this)を返すメンバ関数を持つクラス

Posted: 2013年5月24日(金) 14:24
by かずま
const の付け方が間違っています。
こうすればよいでしょう。

コード:

class Graph {
private:
    int size;
public:
    Graph& operator()();
    const Graph& operator()() const;
};

Graph& Graph::operator()() { return *this; }
const Graph& Graph::operator()() const { return *this; }

Re: (*this)を返すメンバ関数を持つクラス

Posted: 2013年5月26日(日) 03:05
by zxc
  解決しました。
テンプレ-トクラスの定義をcppファイルで行おうとしていたので、すべてヘッダで行うように書き換えたことと、指摘された箇所にconst修飾子を加えたことでコンパイルエラーがなくなりました。

h2so5 さん、かずまさん、分かりやすい御指摘ありがとうございました。