5

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

#include <cmath>

template<typename F> struct Foo { Foo(F) { } };

int main()
{
    Foo<double(double)>(sin);   // no appropriate default constructor available
}
4

2 に答える 2

9

違いがないからです

 Foo<double(double)>(sin);   

 Foo<double(double)> sin;   

どちらも名前の変数を宣言しますsin

パレンは不要です。あなたは好きなだけ多くのparensを置くことができます。

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<iostream>
#include <cmath>

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

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

出力:

called
called
called

デモ: http: //ideone.com/IjFUe

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

ただし、これを試してみると(@fefeがコメントで示唆しているように):

 Foo<double(double)>(&sin);  //declaration, expression

参照変数を宣言し、初期化されていないため、コンパイルエラーが発生するため、機能しません。参照: http: //ideone.com/HNt2Z

于 2011-11-25T00:41:13.443 に答える
0

関数ポインタ型からテンプレートを作成しようとしていると思います。double(double)の意味はわかりませんが、関数ポインタ型を本当に参照したい場合は、次のようにする必要があります。

Foo<double(*)(double)> SinFoo(sin);
于 2011-11-25T01:28:15.390 に答える