2016-08-04 3 views
0

私はテンプレートを作成するたびに関数の引数として渡すことができますが、主な関数の内部でテンプレートを使用できない特別な理由はありますか? テンプレートをパラメータとして使用するのではなく、グローバルタイプとして使用しますか?

template <class Tmp> 

int main() 
{ 
    Tmp pizza; 

} 

しかし、パラメータとして渡すと、常に動作します

template <class Tmp> 
Tmp add(Tmp x, Tmp y) 
{ 
    return x+y; 

} 

上記のコードは実行されませんし、私試みた変数宣言ラインそれ状態「不明なタイプ 『tmp』の」の隣に、私は仮定ので私は主な機能の外にそれを考慮に入れたテンプレートを宣言しました。これがそうであるような特別な理由はありますか?あたかも誰も関数のパラメータの中のテンプレートだけを使用しているようです。

+2

おそらく、あなたは 'typedef'を探していますか? – user694733

+5

構文は最初のスニペットですが、テンプレートをインスタンス化する方法と時期はいつですか? 'Tmp'とは何でしょうか? – Quentin

+1

「ピザ」にはどのようなタイプがありますか? – Galik

答えて

1

あなたはほぼそこにいます。しかし、C++はの静的型の言語なので、コンパイラはタイプpizzaに、のコンパイル時にはを知る必要があります。この

template <class Y> struct/*members are public by default*/ Tmp 
{ 
    typedef Y type; 
}; 

int main() 
{ 
    Tmp<int>::type pizza; /*pizza will be an int*/ 
} 

は合法です。

1

テンプレートはコードではありません。テンプレートは...よくテンプレートです。テンプレート関数を呼び出す前に、インスタンス化する必要があります。例えば。

これは単なるテンプレートにすぎません。つまり、これを単独で書くと、コンパイラはこれに対して1行のコードを作成しません。

int main() { 
    int x = 0; 
    int y = foo<int>(x); // compiler instantiates the template and calls the int instance 
} 

あなたの最初のスニペットでコンパイラは、テンプレートをインスタンス化するために使用する必要がありますどのような種類を知っていません:あなたはインスタンス化し、それを使用するときにのみ、コンパイラが何かを行います。さらに、mainをテンプレートにすることはできません。プログラムのエントリポイントはint main()である必要があります。

PS:

誰もがちょうど関数のパラメータと何よりも内側のテンプレートを使用しているかのように思えます。

さらに多くのことがテンプレートで可能です。私は、テンプレートについて、と考えています。は、コンパイル時にパラメータを選択できるときはいつでも自分のコードをパラメータ化する方法を考えています。この(ビットわざとらしい)例考えてみましょう:インスタンス化されると

// template taking a functor as argument 
// (more precisely: a default constructible callable type) 
template <typename op,typename T> void plug(T x) { 
    std::cout << "op(" << x << ") = " << op()(x) << "\n"; 
} 

// a simple functor 
template <typename T> 
struct identity { T operator()(T x){return x;} }; 

int main() { 
    plug<identity<double>,double>(2.0); 
} 
// prints: 
// op(2) = 2 

を、パラメータは、関数のパラメータとして表示されませんが、それはむしろ(テンプレート)関数は、実際にそのパラメータで何をしているかを制御します。

+0

"テンプレートはコードではありません。テンプレートは...テンプレートでもあります。"まあ、加えて1つ。 – Bathsheba

1

私は私の主な機能

あなたがことができない理由はありません内部のテンプレートを使用することはできませんなぜ、特定の理由がありますが、あなたのコードはあなたの主な機能内のテンプレートを使用していません。むしろ、あなたのコードは、mainを関数テンプレートと定義しようとしています。mainの署名が標準で指定されており、それが関数テンプレートではないため、これはいいことではありません。確かに、実装で代替案を指定することは許可されていますが、実装でテンプレート関数の代替案が指定されていないため、これは役に立ちません。私のコンパイラ(gccは)あなたよりも多くの率直なエラーメッセージを与え、それは言う:あなたはTmpは、テンプレートと呼ばれていると信じているかのように書いている

error: cannot declare ‘::main’ to be a template 

。もしそうなら、あなたの教科書/チュートリアル/何でも見て修正してください。 Tmpはテンプレートではありませんこれはテンプレートパラメータです。 2番目のコードスニペットでは、addは関数テンプレートであり、Tmpはまだテンプレートではありません。テンプレートパラメータはaddです。

パラメータがあるテンプレート内でテンプレートパラメータを使用できます。たとえば、次のように細かいです:

template <class Tmp> 
Tmp add(Tmp x, Tmp y) 
{ 
    Tmp total = x + y; 
    return total; 
} 

あなたの問題は、あなたがこれをしようとしたとき、あなたがテンプレートではないことができ、mainでそれを試してみましただけということです。

関連する問題