早速ですが質問させていただきます。
関数の、template Tを使った引数を省略できるように改良したいと思い、以下のようなプログラムを組んだのですが
エラーが出ます。どこがいけないのでしょうか。
宣言と定義まではエラーが出ないのですが、呼び出すとエラーが出ます。
環境はXcode4.4ですが、VSでもできないのでVS2010です。
よろしくお願いします。
template<typename T>を用いた引数の省略
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: template<typename T>を用いた引数の省略
テンプレート関数でテンプレート引数省略は無理では?
コンパイル時に確定すべきことが確定出来ないので、オブジェクトファイルを作り出せないと思います。
【補足】
C++11から関数テンプレートに対するデフォルトテンプレート引数が使えるようになったみたいです。
書き方は、こちら。
http://d.hatena.ne.jp/gintenlabo/20110302/1299093091
ただし、対応しているコンパイラが必要です。
コンパイル時に確定すべきことが確定出来ないので、オブジェクトファイルを作り出せないと思います。
【補足】
C++11から関数テンプレートに対するデフォルトテンプレート引数が使えるようになったみたいです。
書き方は、こちら。
http://d.hatena.ne.jp/gintenlabo/20110302/1299093091
ただし、対応しているコンパイラが必要です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
bonbo
Re: template<typename T>を用いた引数の省略
>softyaさん
ありがとうございます。
>テンプレート関数でテンプレート引数省略は無理では?
>コンパイル時に確定すべきことが確定出来ないので、オブジェクトファイルを作り出せないと思います。
あらかじめできるようには作っていないのですね。
リンク先の多重定義により解決する方法でできるならそちらでもやってみます。
>h2so5さん
ありがとうございます。
>c++11
VS2010では対応してないみたいですね…残念です。
http://posaune.hatenablog.com/entry/20120225/1330144337
ここにXcodeをC++0xに対応させる方法も書いてあるみたいです。
1年前の記事だからもうすでに対応してるかもしれませんね。
いろいろ教えていただいたので試してみます。
ありがとうございます。
>テンプレート関数でテンプレート引数省略は無理では?
>コンパイル時に確定すべきことが確定出来ないので、オブジェクトファイルを作り出せないと思います。
あらかじめできるようには作っていないのですね。
リンク先の多重定義により解決する方法でできるならそちらでもやってみます。
>h2so5さん
ありがとうございます。
>c++11
VS2010では対応してないみたいですね…残念です。
http://posaune.hatenablog.com/entry/20120225/1330144337
ここにXcodeをC++0xに対応させる方法も書いてあるみたいです。
1年前の記事だからもうすでに対応してるかもしれませんね。
いろいろ教えていただいたので試してみます。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: template<typename T>を用いた引数の省略
1つは、0を参照しているのでこれは出来ません。
もう1つは「あらかじめできるようには作っていないのですね。
リンク先の多重定義により解決する方法でできるならそちらでもやってみます。」に関してですが、
動的に不定の型を処理する機械語(オブジェクト)を作り出せる仕様構造を静的型付け言語であるC++はもっていません。
高速性を犠牲にするので、C++の存在理由に反すると私は思います。
そういうのはインタプリタ・スクリプトの動的型付け言語が得意とするものです。
コンパイル時に型やアドレスを確定させてやることが出来るC++11の書き方であれば省略時の機械語(オブジェクト)が作り出せます。
もう1つは「あらかじめできるようには作っていないのですね。
リンク先の多重定義により解決する方法でできるならそちらでもやってみます。」に関してですが、
動的に不定の型を処理する機械語(オブジェクト)を作り出せる仕様構造を静的型付け言語であるC++はもっていません。
高速性を犠牲にするので、C++の存在理由に反すると私は思います。
そういうのはインタプリタ・スクリプトの動的型付け言語が得意とするものです。
コンパイル時に型やアドレスを確定させてやることが出来るC++11の書き方であれば省略時の機械語(オブジェクト)が作り出せます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
bonbo
Re: template<typename T>を用いた引数の省略
>softyaさん
ありがとうございます。
>高速性を犠牲にするので、C++の存在理由に反する
なるほど…
C++11からの文法を使うと2011年以前にリリースされたiOSで動かないのではないか…と不安だったので
使うのが怖かったのです…
C++11を使うことでできました。
一応やったことをまとめておくと、
Xcodeの設定を変えて(http://posaune.hatenablog.com/entry/20120225/1330144337)
h2so5さんのおっしゃった
このコードにならって修正していく
ということをやりました。
※Xcodeのデフォルトの設定からC++11の設定へと変えると、
最初はいろいろエラーが起こりますが、すべて修正を示唆してくれるエラーなのでその通りに直していけば動くみたいです。
(今回はGLubyte型の変数の初期化などで型キャストする必要がありました。エラーの指摘が厳しくなったみたいです。)
まだ気になる点があるのでまた別途質問します。
どうもありがとうございました。
ありがとうございます。
>高速性を犠牲にするので、C++の存在理由に反する
なるほど…
C++11からの文法を使うと2011年以前にリリースされたiOSで動かないのではないか…と不安だったので
使うのが怖かったのです…
C++11を使うことでできました。
一応やったことをまとめておくと、
Xcodeの設定を変えて(http://posaune.hatenablog.com/entry/20120225/1330144337)
h2so5さんのおっしゃった
template<typename T = int>
void BeZero(int a, T* const _data = nullptr){
if (_data) *_data = 0;
}
ということをやりました。
※Xcodeのデフォルトの設定からC++11の設定へと変えると、
最初はいろいろエラーが起こりますが、すべて修正を示唆してくれるエラーなのでその通りに直していけば動くみたいです。
(今回はGLubyte型の変数の初期化などで型キャストする必要がありました。エラーの指摘が厳しくなったみたいです。)
まだ気になる点があるのでまた別途質問します。
どうもありがとうございました。