zoukankan      html  css  js  c++  java
  • 类模板与友元函数链接问题

    測试环境:windows 7 vs2013

    1.代码

    #include<iostream>
    
    template<class T>
    class Test
    {
    private:
    	T m_x;
    
    public:
    	friend void print(const Test<T> &test);
    	Test(T x) :m_x(x)
    	{
    	}
    };
    template<class T>
     void print(const Test<T> &test)
    {
    	std::cout << test.m_x<< std::endl;
    };
    int main()
    {
    	Test<int> test(1);
    	print(test);
    
    	std::cin.get();
    	return 0;
    }

    上面的程序编译没有问题,链接时候会报例如以下的错误,错误    2    error LNK1120: 1 个无法解析的外部命令,错误  1  error LNK2019: 无法解析的外部符号 "void __cdecl print(class Test<int> const &)" (?print@@YAXABV?

    $Test@H@@@Z)。该符号在函数 _main 中被引用 。

    解决的方法有两种

    1.将友元函数放入函数内部

    #include<iostream>
    
    template<class T>
    class Test
    {
    private:
    	T m_x;
    
    public:
    	friend void print(const Test<T> &test)
    	{
    		std::cout << test.m_x << std::endl;
    	}
    	Test(T x) :m_x(x)
    	{
    	}
    };
    
    int main()
    {
    	Test<int> test(1);
    	print(test);
    
    	std::cin.get();
    	return 0;
    }

    2.仍旧放在外部,採取声明等方式

    #include<iostream>
    
    template<class T>
    class Test;
    template<class T>
    void print(const Test<T> &test);
    
    template<class T>
    class Test
    {
    private:
    	T m_x;
    
    public:
    	friend void print<T>(const Test<T> &test);//这里<T>不可缺少
    	Test(T x) :m_x(x)
    	{
    	}
    };
    template<class T>
     void print(const Test<T> &test)
    {
    	std::cout << test.m_x<< std::endl;
    };
    int main()
    {
    	Test<int> test(1);
    	print(test);
    
    	std::cin.get();
    	return 0;
    }

  • 相关阅读:
    asp.net GDI+绘制矩形渐变
    asp.net GDI+把图片绘制成自定义的椭圆形状
    asp.net TreeView控件绑定数据库显示信息
    asp.net GridView控件中诗选全选和全不选功能
    PHP 笔记——会话控制
    PHP 笔记——String 字符串
    PHP 笔记——Web页面交互
    PHP 笔记——PDO操作数据库
    PHP 笔记——操作MySQL数据库
    PHP 笔记——Array 数组
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7160571.html
Copyright © 2011-2022 走看看