使用非类型参数单独编译模板

时间:2015-02-25 06:55:19

标签: c++ templates

我试图单独编译我​​的非类型参数模板,但我遇到了一些问题。我的应用程序有许多操作码,每个操作码都与某些数据和函数相关联,其中许多是相似的,可以在主模板中定义,然后可以将差异放入专用模板中。

所以这是原始的在线代码: (标题)

#include <iostream>

template<int opcode>
class BAR  
{
public:
    BAR(){};

    void  foo()
    {
        std::cout << "BAR<int>::foo()" << std::endl; 
    } 
}; 

// specialize 1 and 2, otherwise we go with the
// primary definition.
template <>
void BAR<1>::foo()
{
    std::cout << "BAR<1>::foo()" << std::endl;
}
template <>
void BAR<2>::foo()
{
    std::cout << "BAR<2>::foo()" << std::endl;
}  

我有一个简单的&#39;主要&#39;:

int  main(int argc, char* argv[])
{ 
     BAR<1> bar_1;
     BAR<2> bar_2;
     BAR<3> bar_3;

     bar_1.foo();
     bar_2.foo();
     bar_3.foo();

     return 0;
}

我成功地将专业设置为&#39; 1&#39;和&#39; 2&#39;进入一个cpp文件,这是 是)我有的: (标题)

#include <iostream>

template<int opcode>
class BAR  
{
public:
    BAR(){};

    void  foo()
    {
        std::cout << "BAR<int>::foo()" << std::endl; 
    } 
};

// specialize 1 and 2, otherwise we go with the
// primary definition.
template<> void BAR<1>::foo() ;
template<> void BAR<2>::foo() ;

(CPP)

#include "Foo.h"
#include <iostream>  

template<> void BAR<1>::foo()
{
    std::cout << "BAR<1>::foo()" << std::endl;
} 
template<> void BAR<2>::foo()
{
    std::cout << "BAR<2>::foo()" << std::endl;
} 
void x()
{
    BAR<1> b1;
    BAR<2> b2;
    b1.foo();
    b2.foo();
}

我对x()函数并不是很疯狂,但如果没有这个,我会得到BAR&lt; 1&gt; :: foo()&amp;的未解析符号。 BAR&lt; 2&gt; :: foo(),如果有更好的方式,我感兴趣(MSVC 13编译器)。

好到目前为止一切顺利。我真的想把函数foo()的主要定义放到CPP中,但我似乎无法正确理解语法:

template<> void BAR<int>::foo()
{
    std::cout << "BAR<int>::foo()" << std::endl; 
}

这是编译器不允许的,所以我猜是正确的 有效的非类型值。那么用于做这件事的神奇话语是什么?

非常感谢您的帮助。 戴夫。

0 个答案:

没有答案