C++

Qt. Note: No relevant classes found. No output generated.

При написании кода фейкового клиента для unit-тестов столкнулся с такой проблемой, что препроцессор MOC не обрабатывал мой класс, выдавая предупреждение:

Note: No relevant classes found. No output generated.

Исходный код класса:

Теги: 

Использование строковых литералов в качестве аргумента шаблона.

Данная проблема заинтересовала меня благодаря одному из вопросов на сайте ru.stackoverflow.com. При написании статьи я руководствовался стандартом C++11 и использовал компилятор GCC 6.2.0.

Рассмотрим возможность применения строковых литералов (string literals) в качестве аргументов шаблона при инстанцировании. Например:

#include <iostream>

template<const char* s>
class A {
public:
    void foo() {
        std::cout << s << "\n";
    }
};

int main() {
    A<"Hello, world!"> a;
    a.foo();
    return 0;
}

Теги: 

Двухфазный поиск имён (two-stage name lookup).

При работе с шаблонами иногда встречаются неожиданные проблемы, которые трудно определить с первого взгляда. Рассмотрим следующий пример:

#include <iostream>
#include <string>

std::string foo() noexcept {
	return "foo_free_function";
}

template<typename T>
class Base {
	public:
	std::string foo() const noexcept {
		return "foo_Base_function";
	}
};

template<typename T>
class Derived final : public Base<T> {
	public:
	std::string bar() const noexcept {
		return foo();
	}
};

int main() {
	Derived<int> d;
	std::cout << d.bar() << std::endl;
	return 0;
}

Как вы думаете, каков результат выполнения данного кода?

Правильный ответ, как бы это странно ни звучало, зависит от используемого компилятора.

Теги: