C++ 在模板成员函数内调用非模板成员函数

C++ 在模板成员函数内调用非模板成员函数,c++,templates,boost,shared-ptr,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 << "T

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

#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);
}
#包括
#包括
阶级基础
{
公众:
base()
{
}   
void fun2(boost::共享存储和数据)
{

std::cout否。您不能这样做。对于任何类型的模板代码编译的第二阶段,
开关
块必须由编译器完全编译。它将无法编译。您正在将
模板
与程序的运行时行为混合。您最好编写一个不同的函数


请注意,
switch
是运行时,而不是编译时
编译器仍然必须为
int
完全编译它。它不会计算运行时
switch
语句并消除
fun3
,这需要
shared\u ptr

fun3
需要一个指向
double
的指针,您试图编译它时将一个指向
int
的指针传递给它编译器不喜欢它。这有什么奇怪的?我想在fun1中传递不同的数据类型,但根据大小写条件,它应该相应地调用不同的函数。如果我不传递shared_ptr并使用int或double之类的默认数据类型,同样的工作是一样的。你知道编译时的类型,为什么不重载一个函数呢?这已经完成了与模板无关。您在未执行的代码分支中有一个类型错误,希望能够解决它。
if(false){int a=“foo”;}
。不,不起作用。请重新设计您的逻辑。
Error   1   error C2664: 'base::fun3' : cannot convert parameter 1 from 'boost::shared_ptr<T>' to 'boost::shared_ptr<T> &'