множественное наследование шаблонов c ++ из интерфейса

Так что у меня есть эта проблема.

В основном у меня есть шаблонный интерфейс:

template <typename T, typename U>
class                    Iinterface
{
public:
virtual ~Iinterface()
// A pure methode for the example that gives me the problem
virtual std::vector<T>        myMethod(T, U) = 0;
};

На данный момент проблем нет.
Поэтому я объявляю класс, который будет наследовать от этого интерфейса.

class                  firstclass : public Iinterface<std::string, int>
{
// content doesnt matter. The problem is in second class inheritance.
// here I just put the class so we can see how I inherited in 1st class.
};

Теперь объявление myMethod в файле cpp.

template <>
std::vector<std::string>        firstClass::iInterface<std::string, int>::myMethod(std::string a, int b)
{
// methods code
}

Пока что у меня нет проблем. Именно во втором классе я объявляю функцию myMethod, и тип T совпадает с возвращаемым значением, которое дает мне ошибку компиляции.

class                           secondClass : public IInterface<std::vector<std::string>, int>
{
// class content
};

На данный момент он компилируется, но когда я объявляю myMethod следующим образом:

template <>
std::vector<std::string>                     secondClass::Iinterface<std::vector<std::string> a, int n>
{
// methodes code
}

Здесь я получаю ошибку для возвращаемого значения std :: vector и в аргументе методов.
Я считаю, что это конфликт шаблонов, но я действительно не понимаю, как обойти это.

Первая ошибка:

28 :template-id ‘_out<>’ for ‘std::vector<std::basic_string<char> > Iio<std::vector<std::basic_string<char> >, int>::_out(std::vector<std::basic_string<char> >, int)’ does not match any template declaration

Вторая ошибка:

28 note: saw 1 ‘template<>’, need 2 for specializing a member function template

Я все еще учусь кодировать на c ++ и учусь быстро, но время от времени я застреваю и мне нужна помощь.
То, как я пытаюсь сделать это неправильно?
Нужно ли объявлять третье имя, чтобы обойти этот конфликт? (Я думал, что это приведет только к другому конфликту, потому что две типпены одного типа).

Я знаю, что я пытаюсь сделать, возможно, не лучший способ сделать это, но я все еще учусь.

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

Вся помощь будет очень приличной.
Благодарю.

0

Решение

Кажется, что возвращаемое значение для перегрузки функции второго класса должно быть:

std::vector<std::vector<std::string> >

Какой компилятор вы используете, gcc выдал ошибку при спецификации шаблона.

2

Другие решения

Я думаю, что, как правило, лучше хранить шаблонный код в файлах .h (код должен быть доступен во всех единицах перевода, поэтому, если вы помещаете его в файлы .cpp, вы не компилируете их, а включаете их). Помимо опечаток в вашем коде (iInterface против IInterface против Iinterface и т. Д.) Ваш метод во втором классе должен возвращать std::vector<std::vector<std::string> >, Это потому, что ваш тип возврата std::vector<T> и ваш Т std::vector<std::string>, Код ниже (представляющий interface.h) прекрасно компилируется на Mac OS X с использованием clang ++ v 3.3.

#include <string>
#include <vector>template <typename T, typename U>
class Iinterface
{
public:
virtual ~Iinterface();
// A pure methode for the example that gives me the problem
virtual std::vector<T> myMethod(T, U) = 0;
};

class firstclass : public Iinterface<std::string, int>
{
// content doesnt matter. The problem is in second class inheritance.
// here I just put the class so we can see how I inherited in 1st class.

std::vector<std::string> myMethod(std::string a, int b)
{
// methods code
// don't forget to return...
}

};

class secondClass : public Iinterface<std::vector<std::string>, int>
{
// class content
std::vector<std::vector<std::string> > myMethod(std::vector<std::string> a, int n)
{
// methodes code
// don't forget to return...
}

};
2

По вопросам рекламы [email protected]