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;   

两者都声明了一个变量 name 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<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

它们起作用,因为所有三种语法都强制它们成为表达式,而不是变量声明。

但是,如果您尝试这样做(如评论中所建议的@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 回答