首页 > 编程语言 >C++类内模板与模板关键字.template

C++类内模板与模板关键字.template

时间:2022-12-02 22:15:00浏览次数:44  
标签:obj template void Object C++ 类内 fun 模板

C++类外模板参数与类内模板参数

一般来说模板参数会声明在类的tag,以及类成员函数/非成员函数返回值之前;而修饰在类内部成员函数返回值的模板参数可以降低类实例构造,或调用过程中的声明复杂性,同时会导致编译问题。

关键字.template

C++模板编程在遇到类内模板函数声明及定义的情况下,容易导致的一类编译错误:

#include<iostream>
#include<algorithm>
#include<sstream>
#include <iostream>

using namespace std;

template <typename U>
class Object
{
public:
    Object(){};
    virtual ~Object(){};

void _fun(const Object<U>& x)  // 1
    {
        std::cout << "Object::_fun no template arguments" << std::endl;
    }
template <typename T>
void fun(const Object<U>& x) // 2
    {
        std::cout << "Object::fun internal" << std::endl;
    }
template <typename T>
void fun_(const Object<U>& x); // 3

};

template <typename U>
template <typename T>
void Object<U>::fun_(const Object<U>& x) // 3
{
    std::cout << "Object::fun_ external" << std::endl;
}

为上述类提供一个interface及主函数:

 1 template<class U, class T>
 2 void test(Object<U>& obj)
 3 {
 4     obj._fun(obj);
 5     obj.fun<T>(obj);
 6     obj.fun_<T>(obj);
 7 }
 8 
 9 int main(){
10     Object<char> Obj;
11     test<char,int>(Obj);
12     return 0;
13 }

编译报错 error: expected primary-expression before '>' token,分别在line5, line6,对应的成员函数分别是2, 3:

相对于无类内模板参数的成员函数1,原因是在调用模板函数时,g++无法分辨>是一个模板参数的起始符号还是一个比较操作符(大于或小于);所以需要使用关键字告诉g++这是一个模板参数的起始符号。

更新interface:

1 template<class U, class T>
2 void test(Object<U>& obj)
3 {
4     obj._fun(obj);
5     obj.template fun<T>(obj);
6     obj.template fun_<T>(obj);
7 }

可以编译通过:

 

标签:obj,template,void,Object,C++,类内,fun,模板
From: https://www.cnblogs.com/Desh/p/16945773.html

相关文章