0

目前,我在重载某个功能时遇到了一些困难。这是我的代码:

template<typename Value>
bool process(Value thisValue)
{
  return processAccordingToTheType(thisValue);
}

所以,processAccordingToTheType有两个重载函数:

bool processAccordingToTheType(int thisValue){}
bool processAccordingToTheType(string thisValue){}

当我尝试编译它时,它说:

error C2665: 'processAccordingToTheType' : none of the 2 overloads could convert all the argument types

我需要做什么?

更新:

int main()
{
  int i = 1;
  process <int> (i);
}
4

3 回答 3

3

从您的示例代码中,我了解到您需要做两件事:

  1. 调用特定类型的process函数
  2. 限制这些调用stringint类型

将函数包装在processAccordingToType里面process<T>是完全多余的:process<T>实际上意味着“根据类型处理”。这里的关键字是“模板专业化”。您需要专门针对int和的“根据类型处理”方法string

您可以按以下方式执行此操作:

#include <iostream>

using namespace std;

template<typename T>
bool process(T t)
{
    // call a Compile-Time Assertion 
    cout << "I don't want this to be called." << endl;
}

template <>
bool process<int>(int i)
{
    cout << "process(int) called." << endl;
}


template <>
bool process<string>(string s)
{
    cout << "process(string) called." << endl;
}

int main()
{
    process(1);
    process(string("s"));
    process(1.0d);
}

输出:

process(int) called.
process(string) called.
I don't want this to be called.

理想情况下,您希望防止您的 API 的用户process使用其他类型进行调用。不允许他们在运行时调用和处理它(就像在我的示例中所做的那样)是不可接受的。您可以通过编译时断言来实现这一点。阅读 Andrei Alexandrescu 的“Modern C++ Designs”,了解如何做到这一点。

于 2013-03-14T04:03:15.653 回答
0

查看模板专业化。做你正在寻找的东西,而不是根据类型推迟到另一个函数。

http://www.cprogramming.com/tutorial/template_specialization.html

于 2013-03-13T22:19:06.160 回答
0

您可以使用非模板函数或另一个模板函数重载函数模板。确保无论你做什么,你都在增量测试,因为模板错误是出了名的难以理解。

http://www.cplusplus.com/doc/tutorial/templates/

#include <iostream>

using namespace std;


template <typename Value>
bool processAccordingToTheType( Value thisValue ){
    cout << "Generic Type" << endl;
    return false;
}

bool processAccordingToTheType(int thisValue){
    cout << "int type" << endl;
    return true;
}

template <typename Value>
bool process( Value thisValue ){
    return processAccordingToTheType(thisValue);
} 

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

    cout << process( 1 ) << endl;
    cout << process( "Hello" ) << endl;

    return 0;
}
于 2013-03-13T22:20:00.737 回答