24小时热门版块排行榜    

CyRhmU.jpeg
查看: 758  |  回复: 5

lixy1217

木虫 (著名写手)

[求助] 求帮忙看一个关于模板友元函数的错误已有1人参与

对于这样一个简单程序
#include<iostream>
using namespace std;

template < class T >
double func(T&a)
{
        return a.x;
}

class A
{
        private:  double x;
        public:  
                template < class T >
                friend double func(T&a);

                void solve()
                {
                        double s;
                        A a;
                        s=func<A>(a);   ////
                        cout<<s<<endl;
                }
};

void main()
{
        A a;
        a.solve();
}

结果显示了这样的错误:
e:\学习\cpp\测试\test.cpp(21) : error C2440: '=' : cannot convert from 'void' to 'double'
        Expressions of type void cannot be converted to other types

其中21行就是我标有 //// 的那一行。很纳闷,func的申明明明都是以double返回的,可为什么这里貌似却是void型

更加奇怪的是,class A中去掉对于func的友元定义,然后把double x放到public:里面,程序居然又对了,实在没搞懂原因,求高手解答。
回复此楼
偶尔敞开心扉,世界将不再孤独
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

木叶清风

木虫 (正式写手)

第一,x没有初始化;
第二,g++ 4.8.1肯定是能通过的(当然,int main (int argc, char* argv[]))
www.cvdelver.com
2楼2014-01-08 10:34:09
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lixy1217

木虫 (著名写手)

引用回帖:
2楼: Originally posted by 木叶清风 at 2014-01-08 10:34:09
第一,x没有初始化;
第二,g++ 4.8.1肯定是能通过的(当然,int main (int argc, char* argv[]))

初始化时次要问题,可以补充,我这里只是示范了一下遇到的问题,源程序不是这样的。
g++没用过,暂时不会linux~~不过的VS2008或者VS2010这个程序能通过吗?
偶尔敞开心扉,世界将不再孤独
3楼2014-01-08 11:49:13
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

锐利的碎片

木虫 (正式写手)

star watcher

【答案】应助回帖

★ ★ ★
感谢参与,应助指数 +1
lixy1217: 金币+3, 有帮助, 应该确实是转换类型的错误 2014-01-10 10:36:56
内容已删除
4楼2014-01-09 10:45:43
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lixy1217

木虫 (著名写手)

引用回帖:
4楼: Originally posted by 锐利的碎片 at 2014-01-09 10:45:43
实际模板展开时编译器应该不能知道a.x的类型,vc不允许隐含转换,所以转换会出错。
可以在返回时加个static_cast<double>试下。
最好的办法是用c++11的decltype写成这样
template <typename T> auto ...

试过static_cast<double>,还是一样的错误

我的这个破机器连VS2010都安装不了,c++11就更不用想了
偶尔敞开心扉,世界将不再孤独
5楼2014-01-10 10:37:51
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

锐利的碎片

木虫 (正式写手)

star watcher

【答案】应助回帖

引用回帖:
5楼: Originally posted by lixy1217 at 2014-01-10 10:37:51
试过static_cast<double>,还是一样的错误

我的这个破机器连VS2010都安装不了,c++11就更不用想了...

gcc+codeblocks也可以试试。
6楼2014-01-10 20:23:22
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 lixy1217 的主题更新
信息提示
请填处理意见