Рекурсивные шаблоны: ошибка компиляции под g ++ - PullRequest
2 голосов
/ 14 марта 2011

Я пытаюсь использовать шаблоны рекурсивно, чтобы определить (во время компиляции) d-кортеж двойных чисел. Приведенный ниже код прекрасно компилируется с Visual Studio 2010, но g ++ терпит неудачу и жалуется на то, что «не может вызвать конструктор 'point <1> :: point' напрямую".

Может ли кто-нибудь пролить свет на то, что здесь происходит?

Большое спасибо, Джо

#include <iostream>
#include <utility>

using namespace std;

template <const int N>
class point
{

private:
  pair<double, point<N-1> > coordPointPair;

public:

  point()
  {
    coordPointPair.first = 0;
    coordPointPair.second.point<N-1>::point();
  }

};

template<>
class point<1>
{

private:
  double coord;

public:

  point()
  {
    coord= 0;
  }

};

int main()
{
  point<5> myPoint;

  return 0; 
}

Ответы [ 3 ]

7 голосов
/ 14 марта 2011

Что вы пытаетесь сделать:

coordPointPair.second.point<N-1>::point();

Похоже, вы хотите явно вызвать конструктор point по умолчанию - который уже был вызван при создании pair.Вы не можете вызывать конструкторы напрямую (если вы не используете размещение new, что не имеет смысла в этом сценарии)

Просто удалите эту строку.

Если вы по какой-то причине хотите перезаписать уже построенный.second присваивая ему временный point<N-1>, вы можете сделать это с помощью coordPointPair.second = point<N-1>();.

Если в более сложном случае вы хотите передать аргументы конструктору point, вы можете сделать это в списке инициализатора:

point(your_type your_arg) : 
    coordPointPair(
        pair<double, point<N-1> >(0.0, point<N-1>(your_arg_here))
    )
{
}
4 голосов
/ 14 марта 2011

Самое простое решение - использовать список инициализации:

template <const int N>
class point
{

private:
  pair<double, point<N-1> > coordPointPair;

public:

  point() : coordPointPair( std::make_pair( 0.0, point<N-1>() ) )
  {
  }

};

То, что вы реализовали, не соответствует стандарту c ++. Если вы все еще хотите инициализироваться в конструкторе, сделайте это так:

coordPointPair.second = point<N-1>();
2 голосов
/ 14 марта 2011
coordPointPair.second.point<N-1>::point();

Это незаконно. Вы хотели сделать это:

coordPointPair.second = point<N-1>();

Кстати, в этом нет необходимости, потому что к моменту выполнения этого оператора coordPointPair.second уже инициализируется с point<N-1>().

Однако, если в point<> есть какой-либо конструктор не по умолчанию, вы можете сделать это:

coordPointPair.second = point<N-1>(/*arg, ...*/); //pass the arguments

Но опять же, лучше, если вы сделаете это в списке инициализации!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...