模板功能专业化

时间:2015-08-18 17:09:01

标签: c++ templates

我正在对模板进行练习,现在我正在处理专业化。我定义了一个函数T read_val(T& v),它从cin获取输入并编译T val内的template<typename T> struct S。我希望将此功能专门用于intdoublecharstring类型,但是,当我尝试这样做时,我会不断收到错误。这是我写的:

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'”。我正在浏览网上阅读示例和参考资料,但我无法解决它。你能帮助我吗?我需要一个例子来记住它。 谢谢!

1 个答案:

答案 0 :(得分: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等,编译器会为你做这个。)