Почему компилятор вызывает конструктор по умолчанию? - PullRequest
5 голосов
/ 25 ноября 2011

Почему я получаю ошибку ниже?(Почему компилятор пытается вызвать конструктор по умолчанию?)

#include <cmath>

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

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

Ответы [ 2 ]

9 голосов
/ 25 ноября 2011

Это потому, что нет никакой разницы между

 Foo<double(double)>(sin);   

и

 Foo<double(double)> 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<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

0 голосов
/ 25 ноября 2011

Полагаю, вы пытаетесь сделать шаблон из типа указателя на функцию.Не знаю, что означает double (double), но если вы действительно хотите обратиться к типу указателя на функцию, это то, что вы должны сделать:

Foo<double(*)(double)> SinFoo(sin);
...