コンパイラがデフォルトのコンストラクタを呼び出すのはなぜですか?

以下のエラーが表示されるのはなぜですか? (なぜコンパイラがデフォルトのコンストラクタを呼び出そうとしていますか?)

#include 

template struct Foo { Foo(F) { } };

int main()
{
    Foo(sin);  //no appropriate default constructor available
}
5

2 答え

違いはないからです

 Foo(sin);   

そして

 Foo sin;   

両方とも sin という名前の変数を宣言します。

括弧は余分です。あなたはあなたが望むように多くの括約筋を置くことができます。

int x;             //declares a variable of name x
int (x);           //declares a variable of name x
int ((x));         //declares a variable of name x
int (((x)));       //declares a variable of name x
int (((((x)))));   //declares a variable of name x

すべて同じです!

sin を引数としてコンストラクタに渡して、クラスの一時的なインスタンスを作成する場合は、次のようにします。

#include
#include 

template 
struct Foo { Foo(F) { std::cout << "called" << std::endl; } };

int main()
{
    (void)Foo(sin); //expression, not declaration
    (Foo(sin));     //expression, not declaration
    (Foo)(sin);     //expression, not declaration
}

出力:

called
called
called

Demo : http://ideone.com/IjFUe

3つの構文すべてが、変数宣言ではなく、式になるため、これらは機能します。

しかし、これを試してみると(@ fefeがコメントにsugguestedとして):

 Foo(&sin);  //declaration, expression

It is not going to work, for it declares a reference variable, そして since it is not initialized, you will get compilation error. See : http://ideone.com/HNt2Z

9
追加された
@fefe:いいえ、間違っています。参照を宣言します。 Foo (&sin) Foo &sin と同じです。また、初期化されていないため、コンパイルエラーが発生します。
追加された 著者 Nawaz,
@Mehrdad:どのように働くことができますか?コンパイルエラーです: ideone.com/A6evb
追加された 著者 Nawaz,
@Mehrdad:それはエラーでなければなりません。コンパイラのバグです!
追加された 著者 Nawaz,
@Mehrdad:行を void にキャストすると、行全体が強制的に式になり、一時的なものになります。
追加された 著者 bitmask,
OW_O ... [毎日の重量]
追加された 著者 Mehrdad,
うわー...どうすればコンストラクタを呼び出すことができますか?
追加された 著者 Mehrdad,
@bitmask:心配しないで、別の方法を実際に考え出しました.- Foo :: Foo(sin)もうまくいくようです。わーい。
追加された 著者 Mehrdad,
@ナワズ:私はVC + + 08 ...
追加された 著者 Mehrdad,
@ナワズ:うわー、それは私が今日見つけた第2のものです。 (もう1つは、別のテンプレート構造体内にテンプレート構造体を特殊化するときに内部エラーがコンパイラで発生しましたでした...)
追加された 著者 Mehrdad,
@Mehrdad:うーん、私は確かにわからないので、私は実際に私のコメントを削除するつもりです。
追加された 著者 GManNickG,
私は、 Foo (&sin)のように、
追加された 著者 fefe,

私はあなたが関数のポインタ型からテンプレートを作成しようとしていると思います。 Dunnoはdouble(double)を意味しますが、実際に関数ポインタ型を参照したい場合は、何をすべきか:

Foo SinFoo(sin);
0
追加された