ни один экземпляр конструктора не соответствует списку аргументов - типы аргументов: - PullRequest
0 голосов
/ 01 декабря 2018

Я получаю no instance of constructor "MyClass<t>::MyClass [with t=double]" matches the argument list -- argument types are: (MyClass<int>).

Я просто хочу скопировать значение одного объекта в другой.Он отлично работает без синтаксиса шаблона.

#include <iostream>
using namespace std;

template<class t>
class MyClass{
  t x,z;
  public:
    MyClass(){}
    MyClass (const t a,const t b):x(a),z(b) {
    }

    MyClass(const MyClass& obj){
        x=(t) obj.x;
        z=(t)obj.z;
    }

    // access content:
    void  content()  {
        cout<<x<<z<<endl;

    }
};


int main () {
  MyClass<int> foo(34,23);
  MyClass <double> bar(foo);

  bar.content();
  foo.content();

  return 0;
}

Я искал так много вопросов / ответов, связанных с ним, но я не нашел решения

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Проблема в том, что MyClass<int> и MyClass<double> - это разные типы, и у вас есть только конструктор копирования, который принимает объекты одного типа.

Чтобы заставить ваш код работать, мне пришлось изменитьдве вещи:

template<typename u>
MyClass(const MyClass<u>& obj){
    x=(t) obj.x;
    z=(t)obj.z;
}

Теперь конструктор сам шаблонизируется (независимо от класса).Это позволяет вам создать MyClass<A> из другого типа MyClass<B>.

Но простое выполнение этого приводит к другой ошибке:

prog.cpp:14:19: error: ‘int MyClass<int>::x’ is private within this context
         x=(t) obj.x;

Поскольку мы создаем из объектанесвязанный тип, у нас нет доступа к закрытым членам.

Обходной путь: Добавьте объявление friend в класс:

template<typename> friend class MyClass;
0 голосов
/ 01 декабря 2018

MyClass это шаблон.Когда вы пишете MyClass внутри его объявления, это на самом деле сокращение для MyClass<T>, следовательно, MyClass<double> не имеет конструктора, принимающего MyClass<int>.

Если вы хотите разрешить преобразования, вам нужен второй параметр шаблона, например,

template <typename T>
struct foo {};

template <typename R,typename T>
foo<R> convert_foo(const foo<T>& f) { return {}; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...