2015-08-18 4 views
0

Я делаю упражнение по шаблонам, и теперь я имею дело со специализациями. Я определил функцию 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". Я занимался серфингом в чистых примерах чтения и ссылках, но я не могу его решить. Вы можете мне помочь? Мне нужен пример, чтобы исправить это. Спасибо!

+0

http://www.cplusplus.com/doc/tutorial/templates/ посмотрите там «шаблоны классов» и посмотрите пример использования. Похоже, вы не понимали смысла шаблонов и их использования. –

+0

@AlexLop. Я посмотрел, но я не понимаю, что вы имеете в виду. –

+0

Не должно быть файла CPP для заголовка шаблона. Ваша реализация уже находится в файле заголовка! Создать main.cpp с: '#include "header.h"' '# include ' ' INT основных()' ' {' ​​' S my_S;' ' INT знач;' 'S .read_val (&val); '' станд :: соиЬ << "значение чтения является" << Вэл << станд :: епсИ; '' возвращать 0, '' } ' Или что-то подобное, я Жду» t компилировать его ... –

ответ

0

Не должно быть файла CPP для заголовка шаблона. Ваша реализация уже находится в файле заголовка! Создать main.cpp с:

#include "Header.h" 
#include <iostream> 
int main() 
{ 
    S<int> my_S; 
    int val; 

    my_S.read_val(val/*by ref*/); 
    std::cout << "The read value is " << val << std::endl; 
    return 0; 
} 

Или что-то подобное, я не скомпилировать его ... Согласно вашей реализации я вижу, что вы пропустили момент шаблонов. Вы должны определить его только один раз (нет необходимости переписывать его вручную для каждого типа типа int, float и т. Д., Компилятор сделает это за вас).

+0

Я определил их явно, потому что это было частью моей домашней работы! Я знаю, что это было бы бесполезно и многословно. –

Смежные вопросы