使用额外的模板参数编译函数

Compiling a function with extra template parameter

本文关键字:参数 编译 函数      更新时间:2023-10-16

我有以下代码:

文件main.cpp:

#include <iostream>
#include "A.h"
class X{};
int 
main()
{   
    X x;
    A<X> a(x);
}   

文件A-inl.h

#include <iostream>
template <class T1>
A<T1>::A(T1 t)
{
}
template <class T1>
void A<T1>::foo(T1 t1)
{
}
template <class T1, class T2>
void A<T1>::bar(T1 t, T2 t2)   // Compilation Problem
{
}

文件A.h

template <class T1>
class A
{
public:
    explicit A(T1 t1);
    void foo(T1 t1);
    template <class T2>
    void bar(T1 t1, T2 t2); // Compilation Problem
};
#include "A-inl.h"

g++-g main.cpp

In file included from A.h:11:0,
A-inl.h:14:6: error: prototype for ‘void A<T1>::bar(T1, T2)’ does not     match any in class ‘A<T1>’
void A<T1>::bar(T1 t, T2 t2)
  ^
In file included from main.cpp:3:0:
A.h:8:10: error: candidate is: template<class T1> template<class T2> void A<T1>::bar(T1, T2)
 void bar(T1 t1, T2 t2);

你们能告诉我酒吧该怎么申报吗?还有一个问题是,如果在,我可以创建一个对象a;我不知道T2是什么类型的酒吧?条形码将如何生成。

感谢

您的头声明是可以的;但请尝试在函数定义的内联文件中执行此操作。

template<class T1>
template<class T2>
void A<T1>::bar( T1 t, T2 t2 ) {
}

它现在解析、编译和构建;至少在Visual Studio 2015社区中是这样。

这不起作用:

template<class T1, class T2>
void A<T1>::bar( T1 t, T2 t2 ) {
}

因为您的头声明与内联函数定义不匹配,所以这就是您在类模板中声明模板函数的方式:

template<class T2>
void bar( T1 t, T2 t2 );

这就是为什么您需要声明类模板所需的template<class T1>,然后您需要为您的模板函数声明template<class T2>,就像您在类模板中声明它一样。