Так что у меня есть эта проблема.
В основном у меня есть шаблонный интерфейс:
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 ++ и учусь быстро, но время от времени я застреваю и мне нужна помощь.
То, как я пытаюсь сделать это неправильно?
Нужно ли объявлять третье имя, чтобы обойти этот конфликт? (Я думал, что это приведет только к другому конфликту, потому что две типпены одного типа).
Я знаю, что я пытаюсь сделать, возможно, не лучший способ сделать это, но я все еще учусь.
Я попытался сделать пример кода максимально простым, чтобы объяснить мою проблему, если вам нужно больше деталей, не стесняйтесь спрашивать.
Вся помощь будет очень приличной.
Благодарю.
Кажется, что возвращаемое значение для перегрузки функции второго класса должно быть:
std::vector<std::vector<std::string> >
Какой компилятор вы используете, gcc выдал ошибку при спецификации шаблона.
Я думаю, что, как правило, лучше хранить шаблонный код в файлах .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...
}
};