• ベストアンサー

template<calss T> A(const T &t=T())

template<class T> A(const T &t=T()); という関数宣言において引数のところの解釈に戸惑ってます どういう風に解釈したらいいのか教えていただければ幸いです

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

引数 t は型Tのconstな参照体であり、 T()をデフォルトとする。 # 戻り値がありませんよー class Foo { public: Foo(); Foo(int); ... } Foo f(5); A(f); A(); // = A(Foo()) と同じ

nubou
質問者

補足

ありがとうございました 引数がない場合にデフォルトコンストラクタによってT型オブジェクトを構築し それによってできたできたてのT型オブジェクトを引数とするということですか?

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.2

> 引数がない場合にデフォルトコンストラクタによってT型オブジェクトを構築し > それによってできたできたてのT型オブジェクトを引数とするということですか? YES

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C++ template operator T()

    ソースを見ていて分からないところがあったので教えて下さい。 なんと説明すればいいのか分からないので下に要約したソースを書きます。 template <typename T> class Hoge { T a_; public: Hoge(T a = 0) : a_(a) {} operator T() const { // ココが分からない return a_; } }; 最初は、関数オブジェクトかと思ったのですがそうではないですよね? operator()(引数) ですよね? 次は、Tのコンストラクタかと思ったのですが、class Hoge の中に書くのも変な気がしました。

  • 「テンプレート」について

    C++でテンプレートについて調べています。 しかし、参考書や参考サイトを見ても下記の例のような、簡易な処理しか載っていないので、 実際にはどのような使われ方をしているのかわかりません。 例1)引数の大小を比較して、小さい方を返す。 template <class T> inline const T& btMin(const T& a, const T& b) { return b < a ? b : a; } 例2)引数の値を入れ替える処理 template <class T> inline void swap(T& a, T& b) { T temp = a; a = b; b = temp; } そこで、参考書や参考サイトなどでは載っていないような、 思いもよらない使われ方をしているものはご存じありませんか? できれば、使われているオープンソースの場所を教えて頂けると嬉しいです。 皆さんどうかよろしくお願い致します。

  • テンプレートクラスのフレンド関数の宣言

    テンプレートクラスに対して、operator << を定義しようとしてハマってしまったので。 ---- 最終的にできたコードはこんな感じ ---- template<size_t M> class MyContainer; template<size_t N> std::ostream& operator<<( std::ostream& os, MyContainer<N> const& cont ); template<size_t M> class MyContainer {  friend   ostream& operator<< <M>( ostream& , MyContainer<M> const& ); <= ここで「operator<<」としてハマった  public:   MyContainer() { }  private:   void Print_( std::ostream& os ) const {    copy( content_, content_ + M, ostream_iterator<int>( os, "\n" ) );   }  private:   int content_[M]; }; template<size_t N> ostream& operator <<( ostream& os, MyContainer<N> const& cont ) {  cont.Print_( os );  return os; } ------------------------------ テンプレートクラスのfriend関数を宣言する場合に、関数に明示的にテンプレート引数を与えないとテンプレート関数の特殊化だけが friend となるようです。 そういうもんだと言ってしまえばそれまでですが、何故こんな変態的な仕様になってるんでしょう? 特殊化された関数だけをテンプレートクラスのfriend に指定したいような状況が想像できません。

  • テンプレートクラス内のテンプレートクラス(インナークラス)のメソッドを実装ファイルで定義したい

    現在、ヘッダファイル内で下記のようなクラスを宣言・定義しています。 // test.h template < typename T1 > struct A {   template < typename T2 > struct B   {     B( A const& arg ) { ... }   }; }; テンプレートクラスが入れ子になっていて、Bのコンストラクタが引数としてAを取っています。 しかし現状ではコンパイルがとんでもなく遅くなってしまうので、 Bのコンストラクタは宣言のみとし、別途実装ファイル(test.cpp)に定義を書きたいと思っています。 ところがメソッドのシグネチャをどう書けばよいのか分からなくなってしまいました。 苦し紛れに // test.cpp template < typename T1, typename T2 > A<T1>::B<T2>::B( A<T1> const& arg ) { ... } などと書いてみましたが、違うようです。 解決方法はありますでしょうか? 環境はVC7.1かVC8でコンパイルできればよいです。 よろしくお願いいたします。

  • templateを使ったときの未解決の外部シンボルエラー

    以下のプログラムを、Visual C++ 2008でビルドすると、 『error LNK2019: 未解決の外部シンボル "class A<double> __cdecl add(class A<double> const &,double const &)" (?add@@YA?AV?$A@N@@ABV1@ABN@Z) が関数 _main で参照されました。』 のエラーになります。 template < typename T > class A { private: T x, y; public: A( const T& xx, const T& yy ):x(xx),y(yy){} T getx() const {return x;} T gety() const {return y;} friend A<T> add( const A<T>&, const T& ); }; template < typename T > A<T> add( const A<T>& a, const T& z ){ return A(a.x+z, a.y+z); } /* 直前のテンプレートでこの関数を作ったつもりです A<double> add( const A<double>& a, const double& z){ return A<double>(a.x+z, a.y+z); } /**/ #include <iostream> int main() { A<double> a(1.0, 2.0); double z=3.0; std::cout << add(a,z).getx() << "\n"; } どう書けばよいのでしょうか。

  • テンプレート関数でコンパイルが通りません

    テンプレート関数でコンパイルが通りません いつもお世話になってます。テンプレート関数XXXで、引数のTYPE型によって、XXX内で呼び出す関数が変わります。以下の例では、eTypeがAならSetADataを呼び、eTypeがBならSetBDataを呼び出します。XXXのもうひとつの引数がテンプレート部です。本当は、rInfoの型(AInfoまたはBInfo)を判別できればeTypeは不要なのですが、判別の仕方がわからないので、eTypeでrInfoの型を伝えるようにしています。 template<typename T> int XXX( T& rInfo, const TYPE& eType ) if( eType == A ){   SetAData( rInfo ); else if( eType == B ){   SetBData( rInfo ); } // 明示的インスタンス生成 template int XXX<AInfo>( AInfo& rInfo, const TYPE& eType ) template int XXX<BInfo>( Binfo& rInfo, const TYPE& eType ) 上記のようにした時、コンパイラはTの部分をAInfoとBInfoの両方で解釈するので、どうしても以下のようなコンパイルエラーが出ます。 --- `int XXX(T&, const TYPE&) [with T = AInfo]': error: no matching function for call to `SetBData(AInfo&)' note: candidates are: int SetBData(BInfo&) `int XXX(T&, const TYPE&) [with T = BInfo]': error: no matching function for call to `SetAData(BInfo&)' note: candidates are: int SetAData(AInfo&) XXXをテンプレート関数でなく、明示的にAInfoとBInfoのオーバーロードにする手もあるかもしれませんが、XXXの中で、ここには載せていない大多数の部分は、まったく同じなので、テンプレート関数にするのが筋かなと思っています。このコンパイルが通るようにするには、どうすれはよいのでしょうか。

  • const

    次の2つの宣言は同じ意味になりますか? const static char str[] = "a"; static const char str[] = "a";

  • c++におけるtemplateについて

    c++の自作templateを関数宣言部と関数定義部とで、ファイルを分割する事を考えているのですが、エラーが出てtemplateをincludeすることが出来ないでいます。 例えば、 <ファイル:test.H> #ifndef test_H #define test_H #include <iostream> template<class T> class test { private: int row_, col_; public: test( int , int ); }; #endif <ファイル test.C> #include "test.H" template<class T> test<T>::test(int a, int b) :row_(a), col_(b) { std::cout << "コンストラクター" << std::endl; } <ファイル main.C> #include "test.H" #include<iostream> int main() { test a( 3, 3) return 0; } のようにtemplateファイルを分割した場合、 undefined reference to `test<double>::test(int, int)' collect2: ld returned 1 exit status のようなエラーがでます。 書籍:新c++言語入門・シニア編(下)の29章には「export」を関数定義部に付ければ良いような記述がありましたが、エラーを解決することが出来ませんでした。 main.Cにて、test.Cをインクルードするとこの問題を回避することが出来るのですが・・・。 そもそもtemplateは上記のように宣言部と定義部とを別々のファイルにすることはできないのでしょうか?

  • const参照をポインタ引数として渡すには?

    Aというクラスがあって、BはAを継承しているとします。 そこで、Bのconst参照を返却する以下の関数定義があったとします。 const B& getB() { return b; //bはB型 } さらに次の関数があります。 void C(A* a) { //適当な処理 } ここでCを以下のように呼ぼうとするとコンパイルエラーになります。 C(getB()); Cは引数として型Aを求めていますが、BはAを継承しているので、 そのまま渡しても問題ないと思います。 次に、Cは引数としてポインタを求めているのにgetBの戻り値の参照をそのまま 渡しているからまずいのだと思い、以下のようにしました。 const B& hoge = getB(); C(*hoge); //参照をポインタに変換 しかし、さらに型が違うとエラーになります。 どこがまずいのでしょうか? それと、上では参照をポインタに変換するために変数hogeを宣言していますが、 それを省略して一気にやる方法はないでしょうか? C(*getB()); のようなやり方がしたいのですが。

  • const の使い方

    お世話になります。 VC5.0からVC2005.NETにソフトの移植をしているのですが、 その際、const の使い方で混乱しております。 環境:WinXP、VC2005.NET 以下のコードをビルドするとコンパイルエラーが出てしまいます。 ネットで検索しても、混乱中の上自分のケースに当てはまっているのか どうかさえも怪しい状態でして・・・ --コード-- #include "stdafx.h" class A { public: void func( const int*& a ); }; void A::func( const int*& a ) { return; } int _tmain(int argc, _TCHAR* argv[]) { int *a; A CA; CA.func( a ); ←※ここでエラー return 0; } --ここまで-- --エラー-- error C2664: 'A::func' : 1 番目の引数を 'int *' から 'const int *&' に変換できません。(新しい機能 ; ヘルプを参照) --ここまで-- 基本的なことですがご教授願います。