无法使用带参数的模板化方法实例化模板化类

apa*_*mer 0 c++ templates class

我正在尝试开发一个必须模板化的类,并且需要一些模板化的方法.我一直在寻找,很可能因为我不知道如何解释我的问题,我一直无法找到解决方案.这是我的例子:

template<typename T>
class TestClass{
public:
    template<typename M>
    TestClass(M val): val_(T(val)){}

    template<typename N>
    N func() {
        return N(val_);
    }

    T get() {
        return val_;
    }

    template<typename N>
    N add(N val) {
       return N(val_) + val;
   }

private:
    T val_;
};
Run Code Online (Sandbox Code Playgroud)

这个类将在模板化函数中调用,例如:

template<typename T>
std::string str(TestClass<T> f)
{
    std::ostringstream out;
    out << f.func<T>();
    out << "\n";
    out << "get: ";
    out << f.get();
    out << "\n";
    out << f.add<T>(0.0);
   return out.str();
}
Run Code Online (Sandbox Code Playgroud)

这是一个用法示例:

int main(int argc, char** argv){

   TestClass<double> t('a');
    std::cout<<"Manual output: \n";
    std::cout<<"func: "<<t.func<double>()<<std::endl;
    std::cout<<"get: "<<t.get()<<std::endl;
    std::cout<<"add: "<<t.add<double>(0)<<std::endl;
    std::cout<<"operator<< output: \n";
    std::cout<<str(t)<<std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我编写了whithout std::string str(TestClass<T> f)函数及其在内部的用法,main并观察了所需的行为.但是,我无法使用以下错误编译此代码:

error: expected primary-expression before '>' token
    out << f.func<T>();
                   ^ 
expected primary-expression before ')' token
    out << f.func<T>();
                     ^
expected primary-expression before '>' token
    out << f.add<T>(0.0);
                  ^
Run Code Online (Sandbox Code Playgroud)

编译器还会产生有关<<运算符的错误f.func<T>()以及f.add<T>尚未解析的类型和类型.如果我删除了调用中的模板化部分str():

template<typename T>
std::string str(TestClass<T> f)
{
    std::ostringstream out;
    out << f.func();
    out << "\n";
    out << "get: ";
    out << f.get();
    out << "\n";
    out << f.add(0.0);
   return out.str();
}
Run Code Online (Sandbox Code Playgroud)

然后,编译器错误是:

no matching function for call to 'TestClass<double>::func()'
     out << f.func();
         ^
candidate is:template<class N> N TestClass<T>::func() [with N = N; T = double]
     N func() {
       ^
couldn't deduce template parameter 'N'
    out << f.func();
        ^
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为func()类型无法推断.此外,我已经tryied,使用f.func<T>()f.add(0.0)但错误是呈三角第一个.

我的问题是:我该怎么做才能让编译器完成它的工作呢?

Kho*_*ano 5

func调用时,模板成员函数必须标记为模板函数:

f.template func<T>();
Run Code Online (Sandbox Code Playgroud)

所述template需要的关键字,以指示左的尖括号<NOT一个小于运算符.请参阅template关键字的这种使用说明.

add成员函数拿起从参数的模板类型:

f.add(0.0); // typename N = double
Run Code Online (Sandbox Code Playgroud)