在模板成员函数

时间:2016-05-19 04:32:35

标签: c++ templates boost shared-ptr

我在运行以下程序时遇到编译问题: 我在模板成员函数中调用非模板成员函数,但得到了奇怪的编译错误。

#include <iostream>
#include <boost\shared_ptr.hpp>

class base
{
public:
    base()
    {

    }   
    void fun2(boost::shared_ptr<int> &data)
    {
        std::cout << "This is fun2" << std::endl;   
    }
    void fun3(boost::shared_ptr<double> &value)
    {
        std::cout << "This is fun3" << std::endl;
    }
    template <typename T>
    void fun1(int switchParam,T &resonse)
    {
        std::cout << "This is fun1." << std::endl;
        switch(switchParam)
        {
        case 0:
            fun2(resonse);
            break;
        case 1:
            fun3(resonse);
            break;
        }       
    }
};

void main()
{
    boost::shared_ptr<int> myInt;
    int switchParam = 0;
    base b1;
    b1.fun1(switchParam,myInt);
}

遇到以下编译问题:

Error   1   error C2664: 'base::fun3' : cannot convert parameter 1 from 'boost::shared_ptr<T>' to 'boost::shared_ptr<T> &'  

我们将不胜感激。

1 个答案:

答案 0 :(得分:1)

没有。你不能这样做。对于任何类型的模板代码编译的第二阶段,switch块必须由编译器完全编译。它将无法编译。您正在将templates与程序的运行时行为混合在一起。你最好写一个不同的功能。

请注意switch是运行时,而不是编译时。当您将其称为fun1(0)时,编译器仍然必须为int完全编译它。它不会评估运行时switch语句并消除fun3,这需要shared_ptr<double>