Я делаю упражнение по шаблонам, и теперь я имею дело со специализациями. Я определил функцию T read_val(T& v)
, которая принимает данные от cin
и компилирует T val
внутри моего template<typename T> struct S
. Я хочу эту специализацию, чтобы типы int
, double
, char
, string
, но когда я пытаюсь это сделать, я продолжаю получать ошибки. Вот что я писал:Template Function Специализация
header.h:
#ifndef Templates_Header_h
#define Templates_Header_h
#include <iostream>
using namespace std;
template<typename T>
struct S
{
private:
T val;
public:
S() : val{} {};
T* get();
T* get() const;
T set();
T operator=(const T&);
T read_val(T& v);
void print_val() const;
};
template<typename T>
void S<T>::print_val() const
{
cout << "Value is: " << val << endl;
}
template<typename T>
T* S<T>::get()
{
T* p = &val;
return p;
}
template<typename T>
T S<T>::set()
{
T newvalue;
cout << "Type new value: ";
cin >> newvalue;
S<T>::val = newvalue;
return S<T>::val;
}
template<typename T>
T S<T>::operator=(const T&)
{
T val1;
val1 = val;
return *this;
}
template<typename T>
T* S<T>::get() const
{
T* p = &val;
return p;
}
template<typename T>
T S<T>::read_val(T &v)
{
cout << "Type Value: ";
cin >> v;
return S<T>::val = v;
}
#endif
Header.cpp
#include <stdio.h>
#include "Header.h"
#include "std_lib_facilities.h"
template <>
struct S <int> // Specialization
{
private:
int val;
public:
S() : val{0} {};
};
template<>
struct S<char> // Specialization
{
private:
char val;
public:
S() : val{'0'} {};
};
template <>
struct S<double> // Specialization
{
private:
double val;
public:
S() : val{0.0} {};
};
template <>
struct S<string> // Specialization
{
private:
string val;
public:
S() : val{""} {};
};
template<>
struct S<vector<int>> // Specialization
{
private:
vector<int> val;
public:
S() : val{0} {};
};
template<> // !! ERROR !!
int read_val(int& v)
{
cout << "Type a value: ";
cin >> v;
return v;
}
Xcode сообщает "Нет шаблона функции не соответствует функции шаблона специализации" read_val". Я занимался серфингом в чистых примерах чтения и ссылках, но я не могу его решить. Вы можете мне помочь? Мне нужен пример, чтобы исправить это. Спасибо!
http://www.cplusplus.com/doc/tutorial/templates/ посмотрите там «шаблоны классов» и посмотрите пример использования. Похоже, вы не понимали смысла шаблонов и их использования. –
@AlexLop. Я посмотрел, но я не понимаю, что вы имеете в виду. –
Не должно быть файла CPP для заголовка шаблона. Ваша реализация уже находится в файле заголовка! Создать main.cpp с: '#include "header.h"' '# include' ' INT основных()' ' {' ' S my_S;' ' INT знач;' 'S .read_val (&val); '' станд :: соиЬ << "значение чтения является" << Вэл << станд :: епсИ; '' возвращать 0, '' } ' Или что-то подобное, я Жду» t компилировать его ... –