如何通过构造函数初始化模板变量并打印出来?

时间:2015-08-31 09:31:31

标签: c++

我是C ++的新手,我正在阅读第19章  [使用C ++编程原则和实践]

但我不知道如何使用构造函数初始化模板变量并按函数打印。 谁能告诉我最简单的方法呢?

#include "stdafx.h"
#include "C:/std_lib_facilities.h"

template<typename T>
struct S {
    T val;
    S(T theval) { val = theval; }
};

template<typename T> 
void print(T theval) // function template
{
    cout <<theval<< '\n';
}

int main()
{
    S<int> x1 {1};


    print(1); //OK
    print(x1);//error:C2697
return 0;
}

4 个答案:

答案 0 :(得分:1)

您还应为结构指定print,例如只需添加:

template<typename T> 
void print(S<T> s)
{
    cout << s.val << '\n';
}

答案 1 :(得分:0)

您将struct S元素传递给print()函数,但它期望参数是theval的类型。正确的解决方案是只传递新x1对象的.val元素:

#include <iostream>

template<typename T>
struct S {
    T val;
    S(T theval) { val = theval; }
};

template<typename T> 
void print(T theval) // function template
{
    std::cout << theval << '\n';
}

int main()
{
    S<int> x1(1);

    print(1); //OK
    print(x1.val);
return 0;
}

...或更改print()函数的定义:
 让它期望结构S元素S<T> s,然后在它内部std::cout << s.val << "\n";

template<typename T> 
void print(S<T> s) // function template
{
    std::cout << s.val << '\n';
}

答案 2 :(得分:0)

由于您是新手而不是直接回答我强烈建议您阅读本教程并尝试自行解答,因为它是可搜索的问题。

请点击此链接(本教程中您的问题的答案可用):

http://www.codeproject.com/Articles/257589/An-Idiots-Guide-to-Cplusplus-Templates-Part

答案 3 :(得分:0)

您的S类没有运算符&lt;&lt;要打印到cout,请添加一个:

template<typename T>
ostream& operator<<(ostream& os, const S<T>& dt)
{
    os << dt.val;
    return os;
}

如果你想让val成为你的结构/类的私人部分(推荐),那就让operator<<成为朋友:

template<typename T>
struct S {
private:    
    T val;
    public:
    S(T theval) { val = theval; }

    template<typename X>
    friend ostream& operator<<(ostream& os, const S<X>& dt);
};

template<typename X>
ostream& operator<<(ostream& os, const S<X>& dt)
{
    os << dt.val;
    return os;
}