小编use*_*012的帖子

为什么非模板化函数具有相同的名称和参数但返回类型不同是非法的?(但模板功能合法吗?)

我查看了一些相关的堆栈溢出线程,例如模板函数重载的这种情况,这让我无法理解

函数重载按返回类型?

但似乎都没有给我我正在寻找的答案,至少不是一种容易让我解释的方式.

我的问题归结为:从设计和技术的角度来看,为什么这样做是合法的:

#include <iostream>

using namespace std;

template<class T>
void func(){
    cout << "Compiler inferred from void return value!\n";
}

template<class T>
int func(){
    cout << "Compiler inferred from int return value!\n";
    return 0;
}

int main(){
    void (*thisFunc)()=func<int>;
    int (*thatFunc)()=func<int>;
    thisFunc();
    thatFunc();
}
Run Code Online (Sandbox Code Playgroud)

但不是这个:

#include <iostream>

using namespace std;

void func(){
    cout << "You won't see this because it won't compile!\n";
}

int func(){
    cout << "Nor this one!\n";
    return 0;
}

int main(){
    void …
Run Code Online (Sandbox Code Playgroud)

c++ templates overloading ambiguity

11
推荐指数
1
解决办法
329
查看次数

当Base和Derived都使用派生类型参数进行模板化时调用基础构造函数时出现编译器错误

我很难理解为什么以下代码无法编译:

template <class T>
class Base {
    public:
        Base(int a){}
};
template <class T>
class Derived: public Base<T>  {
    public:
        Derived(int a): Base(a){}
};
int main(){}
Run Code Online (Sandbox Code Playgroud)

在我的编译器(gcc 5.4.0 with C++ 11)上输出错误消息

error: class 'Derived<T>' does not have any field named 'Base'
         Derived(int a): Base(a){}
Run Code Online (Sandbox Code Playgroud)

我看到这有点类似于成员初始化列表错误中的模板基础构造函数调用,尽管该测试用例实际上为我编译而这个不是:主要区别似乎是两者BaseDerived使用相同的类型参数.另外,如果我明确添加类型参数或者为base提供明确的范围,它编译得很好,如

template <class T>
class Base {
    public:
        Base(int a){}
};

template <class T>
class Derived: public Base<T>  {
    public:
        Derived(int a): Derived::Base(a){}
};

int main(){}
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?在注入类名时我是否会误解?

c++ inheritance templates c++11

4
推荐指数
1
解决办法
195
查看次数

标签 统计

c++ ×2

templates ×2

ambiguity ×1

c++11 ×1

inheritance ×1

overloading ×1